欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloud 服務(wù)注冊(cè)和消費(fèi)實(shí)現(xiàn)過(guò)程

 更新時(shí)間:2020年07月17日 11:05:06   作者:代碼忘煩惱  
這篇文章主要介紹了SpringCloud 服務(wù)注冊(cè)和消費(fèi)實(shí)現(xiàn)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

系統(tǒng)架構(gòu)

在沒(méi)有微服務(wù)之前有已經(jīng)有跨服務(wù)調(diào)用了,比如ServiceB去調(diào)用ServiceA中的服務(wù) , 傳統(tǒng)模式可以直接在ServiceB中寫ServiceA中的服務(wù)但是這樣是寫死了的,不夠靈活。

下圖就是傳統(tǒng)的調(diào)用


微服務(wù)下的跨系統(tǒng)調(diào)用應(yīng)該是這樣的:


此時(shí)服務(wù)的調(diào)用應(yīng)該是分兩個(gè)步驟的:
ServiceB 去服務(wù)中心拿到ServiceA的地址,如果ServiceA是單機(jī)部署,那么這個(gè)地址就只有一個(gè),如果ServiceA是集群是集群環(huán)境部署,那么發(fā)現(xiàn)的地址就是多個(gè)。

拿到了ServiceA的地址后,ServiceB再去調(diào)用ServiceA的相關(guān)服務(wù)了。

這樣做其實(shí)是有很多好處的,首先互相調(diào)用的地址可以不用寫死,需要的時(shí)候直接去服務(wù)中心獲取,并且服務(wù)之間也可以很方便的部署、集群等。

服務(wù)注冊(cè)與消費(fèi)搭建

1.首先我們創(chuàng)建一個(gè)ServiceRegister的普通maven項(xiàng)目,然后在創(chuàng)建一個(gè)Eureka的SpringBoot項(xiàng)目作為子項(xiàng)目


下面是Eureka項(xiàng)目的pom.xml 配置

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

下面是application.yml 配置文件

# 別名
spring:
 application:
  name: eureka
#端口
server:
 port: 1111

# eureka config
eureka:
 client:
  register-with-eureka: false
  fetch-registry: false

注意 這里配置好了后需要在Eureka這個(gè)子項(xiàng)目的啟動(dòng)類上加入下面這個(gè)注解

@EnableEurekaServer

這個(gè)注解的意義是代表這個(gè)項(xiàng)目成為一個(gè)注冊(cè)中心

2.創(chuàng)建一個(gè)Provider

創(chuàng)建一個(gè)叫Provider的SpringBoot項(xiàng)目作為子項(xiàng)目,pom.xml配置

<properties>
  <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  </dependency>
</dependencies>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring-cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

下面是application.yml 配置文件

# 別名
spring:
 application:
  name: provider
#端口
server:
 port: 4001
# provider config
eureka:
 client:
  service-url:
   defaultZone: http://localhost:1111/eureka 

spring.application.name 是服務(wù)的名稱,你可以理解成是別名,其他的服務(wù)調(diào)用的時(shí)候需要使用這個(gè)name來(lái)調(diào)用

server.port 是端口號(hào)

eureka.client.service-url.defaultZone 是這個(gè)服務(wù)需要注冊(cè)到服務(wù)中心地址,這里需要注意的是,如果服務(wù)中心是一個(gè)集群,這里也可以只寫服務(wù)中心的一個(gè)節(jié)點(diǎn),eureka會(huì)自動(dòng)集群對(duì)服務(wù)進(jìn)行同步。

在微服務(wù)中,你的項(xiàng)目的pom.xml 中如果存在 spring-cloud-starter-netflix-eureka-client的依賴,并且提供了eureka注冊(cè)中心的地址那么會(huì)默認(rèn)注冊(cè)到 Eureka Server 中。

然后我們?cè)?provider 中提供一個(gè)簡(jiǎn)單的服務(wù)

@RestController
public class SayHelloController {
 @GetMapping("/sayHello")
 public String SayHello(String name) {
  return "sayHello" + name + "!";
 }
}

這樣我們就創(chuàng)建好我們的服務(wù)提供者,并且提供了一個(gè)簡(jiǎn)單的服務(wù)接口了。

3.創(chuàng)建consumer

創(chuàng)建好了服務(wù)提供者,那么我們就來(lái)創(chuàng)建服務(wù)消費(fèi)者consumer,創(chuàng)建一個(gè)SpringBoot的子項(xiàng)目工程 pom依賴如下

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

這個(gè)配置和provider 配置幾乎是一樣的,下面是consumer的application.yml 配置文件

# 別名
spring:
 application:
  name: consumer
#端口
server:
 port: 4002
# provider config
eureka:
 client:
  service-url:
   defaultZone: http://localhost:1111/eureka 

唯一變了就是服務(wù)的名稱。

配置好了后,我們?cè)赾onsumer的啟動(dòng)類中添加一個(gè)RestTemplate的實(shí)例,RestTemplate是Spring提供的一個(gè)Http請(qǐng)求工具,下面是這個(gè)RestTemplate實(shí)例的代碼

@SpringBootApplication
public class ConsumerApplication {

  public static void main(String[] args) {
    SpringApplication.run(ConsumerApplication.class, args);
  }

  @Bean
  RestTemplate restTemplate() {
    return new RestTemplate();
  }
}

然后我們?cè)赾onsumer 中添加一個(gè)UserSayHelloController,在這里去調(diào)用provider 提供的服務(wù)。

@RestController
public class SayUserHelloController {
  @Autowired
  DiscoveryClient discoveryClient;
  @Autowired
  RestTemplate restTemplate;
  @GetMapping("/sayHello")
  public String hello(String name) {
    List<ServiceInstance> list = discoveryClient.getInstances("provider");
    ServiceInstance instance = list.get(0);
    String host = instance.getHost();
    int port = instance.getPort();
    String s = restTemplate.getForObject("http://" + host + ":" + port + "/hello?name={1}", String.class, name);
    return s;
  }
}

上面代碼的意思是解釋如下:

首先我們?cè)谶@個(gè)Controller中注入了一個(gè)DiscoveryClient ,DiscoveryClient可以從Eureka或者從Consul上根據(jù)服務(wù)名查詢一個(gè)服務(wù)的詳細(xì)信息,注意DiscoveryClient是下面這個(gè)包中的

org.springframework.cloud.client.discovery.DiscoveryClient
@Autowired
 RestTemplate restTemplate;

RestTemplate 就是Spring 給我們提供用來(lái)發(fā)送Http請(qǐng)求的,這個(gè)大多數(shù)人應(yīng)該都是知道的。

List<ServiceInstance> list = discoveryClient.getInstances("provider");

discoveryClient.getInstances 就是調(diào)用服務(wù)的名稱,為什么用List去接受? 那是因?yàn)橛锌赡躳rovider 是單機(jī)部署 也有可能是集群部署,如果是集群部署的話,那么provider的實(shí)例就有多個(gè)

ServiceInstance 保存了provider 中 詳細(xì)的信息、如主機(jī)地址、端口號(hào)、實(shí)例id等。ServiceInstance是一個(gè)接口,它有很多給實(shí)現(xiàn)類,我們本次的這個(gè)項(xiàng)目使用的是EurekaServiceInstance。

ServiceInstance instance = list.get(0);

因?yàn)槲覀冎挥幸粋€(gè)provider 實(shí)例,所以我們就用list.get(0) 來(lái)獲取實(shí)例了

獲取主機(jī)地址

String host = instance.getHost();

獲取端口號(hào)

int port = instance.getPort();

RestTemplate 的 getForObject 方法接收三個(gè)參數(shù)。第一個(gè)參數(shù)是請(qǐng)求地址,請(qǐng)求地址中的 {1} 表示一個(gè)參數(shù)占位符,第一個(gè)參數(shù) String.class 表示返回的參數(shù)類型,第三個(gè)參數(shù)則是一個(gè)第一個(gè)占位符的具體值。

String s = restTemplate.getForObject("http://" + host + ":" + port + "/hello?name={1}", String.class, name);

最后我們返回這個(gè)s 就完成了consumer的編寫

下面我們依次的啟動(dòng)Eureka(注冊(cè)中心)和 服務(wù)提供者(provider) 以及 消費(fèi)者(consumer)

然后在瀏覽器上輸入:
localhost:4002/sayHello?name=jishu
結(jié)果如下圖所示:

這樣我們就順利的從consumer 去調(diào)用了provider 的服務(wù)了

DiscoveryClient是哪里來(lái)的

歸根結(jié)底 DiscoveryClient作用就是可以從Eureka 或者Consul 中查詢服務(wù)的實(shí)例,不過(guò)DiscoveryClient就是一個(gè)接口而已,但是還是有一個(gè)實(shí)現(xiàn)類, 這個(gè)具體的實(shí)現(xiàn)類就是CompositeDiscovery,當(dāng)我們的微服務(wù)啟動(dòng)的時(shí)候,就會(huì)在CompositeDiscoveryClientAutoConfiguration類中配置一個(gè)CompositeDiscovery的實(shí)例,下面這個(gè)就是大名鼎鼎的CompositeDiscoveryClientAutoConfiguration的源碼

//這里就是DiscoveryClient的源碼了
@Configuration
@AutoConfigureBefore(SimpleDiscoveryClientAutoConfiguration.class)
public class CompositeDiscoveryClientAutoConfiguration {

 //這里返回的是一個(gè)實(shí)例
	@Bean
	@Primary
	public CompositeDiscoveryClient compositeDiscoveryClient(
			List<DiscoveryClient> discoveryClients) {
		return new CompositeDiscoveryClient(discoveryClients);
	}

}

其實(shí)真正調(diào)用的是CompositeDiscoveryClient類中的discoveryClients 屬性提供的 DiscoveryClient,而discoveryClients 屬性默認(rèn)集合中只有一條數(shù)據(jù),就是EurekaDiscoveryClient,最終在EurekaDiscoveryClient類中,通過(guò)EurekaClient來(lái)獲取一個(gè)微服務(wù)的實(shí)例信息了

總結(jié)

在不用微服務(wù)調(diào)用,服務(wù)之間的調(diào)用是相當(dāng)繁瑣的,并且地址是寫死了,那么部署的話是非常的不方便,但是我們提供了注冊(cè)中心的話,那么我們讓服務(wù)注冊(cè)到我們的注冊(cè)中心中,然后在從注冊(cè)中心去獲取我們的服務(wù)信息,這樣就有大大的好處,降低了調(diào)用的難度。

項(xiàng)目地址

github

到此這篇關(guān)于SpringCloud 服務(wù)注冊(cè)和消費(fèi)實(shí)現(xiàn)過(guò)程的文章就介紹到這了,更多相關(guān)SpringCloud 服務(wù)注冊(cè) 消費(fèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot集成SpirePDF實(shí)現(xiàn)文本替換功能

    SpringBoot集成SpirePDF實(shí)現(xiàn)文本替換功能

    SpirePDF是一個(gè)用于.NET平臺(tái)的高級(jí)PDF文檔處理庫(kù),它提供了一套完整的API,允許開(kāi)發(fā)者創(chuàng)建、編輯、轉(zhuǎn)換、合并、分割和解析PDF文件本文給大家介紹了SpringBoot集成SpirePDF實(shí)現(xiàn)文本替換功能,需要的朋友可以參考下
    2024-09-09
  • JAVA中的注解機(jī)制解讀

    JAVA中的注解機(jī)制解讀

    這篇文章主要介紹了JAVA中的注解機(jī)制解讀,通過(guò)調(diào)用Java的反射機(jī)制相關(guān)API來(lái)訪問(wèn)annotation信息,首先加載使用注解的類,得到class類,然后再得到類相應(yīng)的方法,成員變量,需要的朋友可以參考下
    2023-10-10
  • Spring init-method與destroy-method屬性的用法解析

    Spring init-method與destroy-method屬性的用法解析

    這篇文章主要介紹了Spring init-method與destroy-method屬性的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java分割文本字符串的方法

    java分割文本字符串的方法

    這篇文章主要為大家詳細(xì)介紹了java分割文本字符串的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 找不到正確的java_home路徑報(bào)錯(cuò)解決

    找不到正確的java_home路徑報(bào)錯(cuò)解決

    本文主要介紹了找不到正確的java_home路徑報(bào)錯(cuò)解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 2020 IDEA安裝教程與激活(idea2020激活碼)

    2020 IDEA安裝教程與激活(idea2020激活碼)

    這篇文章主要介紹了2020 IDEA安裝教程與激活(idea2020激活碼),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Maven發(fā)布封裝到中央倉(cāng)庫(kù)時(shí)候報(bào)錯(cuò):no default secret key

    Maven發(fā)布封裝到中央倉(cāng)庫(kù)時(shí)候報(bào)錯(cuò):no default secret key

    這篇文章主要介紹了Maven發(fā)布封裝到中央倉(cāng)庫(kù)時(shí)候報(bào)錯(cuò):no default secret key,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Java實(shí)現(xiàn)經(jīng)典游戲2048的示例代碼

    Java實(shí)現(xiàn)經(jīng)典游戲2048的示例代碼

    2014年Gabriele Cirulli利用周末的時(shí)間寫2048這個(gè)游戲的程序。本文將用java語(yǔ)言實(shí)現(xiàn)這一經(jīng)典游戲,并采用了swing技術(shù)進(jìn)行了界面化處理,需要的可以參考一下
    2022-02-02
  • Springboot如何加載靜態(tài)圖片

    Springboot如何加載靜態(tài)圖片

    這篇文章主要介紹了Springboot如何加載靜態(tài)圖片,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java的Console類的使用方法及實(shí)例

    java的Console類的使用方法及實(shí)例

    這篇文章主要介紹了java的Console類的使用方法及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評(píng)論