溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Eureka搭建簡(jiǎn)單的服務(wù)端注冊(cè)服務(wù)

發(fā)布時(shí)間:2021-12-29 09:25:42 來(lái)源:億速云 閱讀:166 作者:iii 欄目:軟件技術(shù)

這篇文章主要講解了“如何使用Eureka搭建簡(jiǎn)單的服務(wù)端注冊(cè)服務(wù)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何使用Eureka搭建簡(jiǎn)單的服務(wù)端注冊(cè)服務(wù)”吧!

案例中有三個(gè)角色:服務(wù)注冊(cè)中心、服務(wù)提供者、服務(wù)消費(fèi)者,其中服務(wù)注冊(cè)中心就是我們上一篇的 Eureka 單節(jié)點(diǎn)啟動(dòng)既可。

流程如下:

啟動(dòng)注冊(cè)中心

服務(wù)提供者生產(chǎn)服務(wù)并注冊(cè)到服務(wù)中心中

消費(fèi)者從服務(wù)中心中獲取服務(wù)并執(zhí)行

服務(wù)提供者
我們假設(shè)服務(wù)提供者有一個(gè) hello() 方法,可以根據(jù)傳入的參數(shù),提供輸出 “hello xxx + 當(dāng)前時(shí)間” 的服務(wù)。

POM 包配置
創(chuàng)建一個(gè)基本的 Spring Boot 應(yīng)用,命名為 eureka-producer,在 pom.xml 中添加如下配置:

<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>

配置文件
application.yml 配置如下

spring:
  application:
    name: eureka-producer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7000/eureka/
server:
  port: 8000

通過(guò) spring.application.name 屬性,我們可以指定微服務(wù)的名稱(chēng)后續(xù)在調(diào)用的時(shí)候只需要使用該名稱(chēng)就可以進(jìn)行服務(wù)的訪問(wèn)。eureka.client.serviceUrl.defaultZone 屬性對(duì)應(yīng)服務(wù)注冊(cè)中心的配置內(nèi)容,指定服務(wù)注冊(cè)中心的位置。為了在本機(jī)上測(cè)試區(qū)分服務(wù)提供方和服務(wù)注冊(cè)中心,使用 server.port 屬性設(shè)置不同的端口。

啟動(dòng)類(lèi)

保持默認(rèn)生成的即可, Finchley.RC1 這個(gè)版本的 Spring Cloud 已經(jīng)無(wú)需添加 @EnableDiscoveryClient 注解了。(那么如果我引入了相關(guān)的 jar 包又想禁用服務(wù)注冊(cè)與發(fā)現(xiàn)怎么辦?設(shè)置 eureka.client.enabled=false)

@EnableDiscoveryClient is no longer required. You can put a DiscoveryClient implementation on the classpath to cause the Spring Boot application to register with the service discovery server.

Spring Cloud - @EnableDiscoveryClient

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

啟動(dòng)工程后,就可以在注冊(cè)中心 Eureka 的頁(yè)面看到 EUERKA-PRODUCER 服務(wù)。

服務(wù)消費(fèi)者

創(chuàng)建服務(wù)消費(fèi)者根據(jù)使用 API 的不同,大致分為三種方式。雖然大家在實(shí)際使用中用的應(yīng)該都是 Feign,但是這里還是把這三種都介紹一下吧,如果你只關(guān)心 Feign,可以直接跳到最后。

如何使用Eureka搭建簡(jiǎn)單的服務(wù)端注冊(cè)服務(wù)

三種方式均使用同一配置文件,不再單獨(dú)說(shuō)明了

spring:
  application:
    name: eureka-consumer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7000/eureka/ # 指定 Eureka 注冊(cè)中心的地址
server:
  port: 9000 # 分別為 9000、9001、9002

使用 LoadBalancerClient

從 LoadBalancerClient 接口的命名中,我們就知道這是一個(gè)負(fù)載均衡客戶端的抽象定義,下面我們就看看如何使用 Spring Cloud 提供的負(fù)載均衡器客戶端接口來(lái)實(shí)現(xiàn)服務(wù)的消費(fèi)。

POM 包配置

我們先來(lái)創(chuàng)建一個(gè)服務(wù)消費(fèi)者工程,命名為:eureka-consumer。pom.xml 同 Producer 的,不再贅述。

啟動(dòng)類(lèi)

初始化 RestTemplate,用來(lái)發(fā)起 REST 請(qǐng)求。

@SpringBootApplication
public class EurekaConsumerApplication {
   @Bean 
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(EurekaConsumerApplication.class, args);
    }
}

Controller
創(chuàng)建一個(gè)接口用來(lái)消費(fèi) eureka-producer 提供的接口:

@RequestMapping ("/hello")
@RestController 
public class HelloController {
   @Autowired 
    private LoadBalancerClient client;
    @Autowired
    private RestTemplate restTemplate;
   @GetMapping ("/")
    public String hello(@RequestParam String name) {
        name += "!";
        ServiceInstance instance = client.choose("eureka-producer");
        String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/hello/?name=" + name;
        return restTemplate.getForObject(url, String.class);
    }
}

可以看到這里,我們注入了 LoadBalancerClient 和 RestTemplate,并在 hello 方法中,先通過(guò) loadBalancerClient 的 choose 方法來(lái)負(fù)載均衡的選出一個(gè) eureka-producer 的服務(wù)實(shí)例,這個(gè)服務(wù)實(shí)例的基本信息存儲(chǔ)在 ServiceInstance 中,然后通過(guò)這些對(duì)象中的信息拼接出訪問(wèn)服務(wù)調(diào)用者的 /hello/ 接口的詳細(xì)地址,最后再利用 RestTemplate 對(duì)象實(shí)現(xiàn)對(duì)服務(wù)提供者接口的調(diào)用。

另外,為了在調(diào)用時(shí)能從返回結(jié)果上與服務(wù)提供者有個(gè)區(qū)分,在這里我簡(jiǎn)單處理了一下,name+="!",即服務(wù)調(diào)用者的 response 中會(huì)比服務(wù)提供者的多一個(gè)感嘆號(hào)(!)。

Spring Cloud Ribbon

之前已經(jīng)介紹過(guò) Ribbon 了,它是一個(gè)基于 HTTP 和 TCP 的客戶端負(fù)載均衡器。它可以通過(guò)在客戶端中配置 ribbonServerList 來(lái)設(shè)置服務(wù)端列表去輪詢?cè)L問(wèn)以達(dá)到均衡負(fù)載的作用。

當(dāng) Ribbon 與 Eureka 聯(lián)合使用時(shí),ribbonServerList 會(huì)被 DiscoveryEnabledNIWSServerList 重寫(xiě),擴(kuò)展成從 Eureka 注冊(cè)中心中獲取服務(wù)實(shí)例列表。同時(shí)它也會(huì)用 NIWSDiscoveryPing 來(lái)取代 IPing,它將職責(zé)委托給 Eureka 來(lái)確定服務(wù)端是否已經(jīng)啟動(dòng)。

POM 包配置

將之前的 eureka-consumer 工程復(fù)制一份,并命名為 eureka-consumer-ribbon。

pom.xml 文件還用之前的就行。至于 spring-cloud-starter-ribbon,因?yàn)槲沂褂玫?Spring Cloud 版本是 Finchley.RC1,spring-cloud-starter-netflix-eureka-client 里邊已經(jīng)包含了 spring-cloud-starter-netflix-ribbon 了。

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

啟動(dòng)類(lèi)
修改應(yīng)用主類(lèi),為 RestTemplate 添加 @LoadBalanced 注解

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

Controller
修改 controller,去掉 LoadBalancerClient,并修改相應(yīng)的方法,直接用 RestTemplate 發(fā)起請(qǐng)求

@GetMapping("/")
public String hello(@RequestParam String name) {
    name += "!";
    String url = "http://eureka-producer/hello/?name=" + name;
    return restTemplate.getForObject(url, String.class);
}

可能你已經(jīng)注意到了,這里直接用服務(wù)名 eureka-producer 取代了之前的具體的 host:port。那么這樣的請(qǐng)求為什么可以調(diào)用成功呢?因?yàn)?Spring Cloud Ribbon 有一個(gè)攔截器,它能夠在這里進(jìn)行實(shí)際調(diào)用的時(shí)候,自動(dòng)的去選取服務(wù)實(shí)例,并將這里的服務(wù)名替換成實(shí)際要請(qǐng)求的 IP 地址和端口,從而完成服務(wù)接口的調(diào)用。

Spring Cloud Feign

在實(shí)際工作中,我們基本上都是使用 Feign 來(lái)完成調(diào)用的。我們通過(guò)一個(gè)例子來(lái)展現(xiàn) Feign 如何方便的聲明對(duì) eureka-producer 服務(wù)的定義和調(diào)用。歡迎大家加我qq:1038774626探討技術(shù)問(wèn)題。

POM 包配置

創(chuàng)建一個(gè)基本的 Spring Boot 應(yīng)用,命名為 eureka-producer-feign,在 pom.xml 中添加如下配置:

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

啟動(dòng)類(lèi)
在啟動(dòng)類(lèi)上加上 @EnableFeignClients

@EnableFeigClients
@SpringBootApplication
public class EurekaConsumerFeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaConsumerFeignApplication.class, args);
    }
}

此類(lèi)中的方法和遠(yuǎn)程服務(wù)中 Contoller 中的方法名和參數(shù)需保持一致。

這里有幾個(gè)坑,后邊有詳細(xì)說(shuō)明。

Controller
修改 Controller,將 HelloRemote 注入到 controller 層,像普通方法一樣去調(diào)用即可

@RequestMapping
@Restcontroller ("/hello")
public class HelloController {
    @Autowired
    HelloRemote helloRemote;
  @GetMapping  ("/{name}")
    public String index(@PathVariable("name") String name) {
        return helloRemote.hello(name + "!");
    }
}

通過(guò) Spring Cloud Feign 來(lái)實(shí)現(xiàn)服務(wù)調(diào)用的方式非常簡(jiǎn)單,通過(guò) @FeignClient 定義的接口來(lái)統(tǒng)一的聲明我們需要依賴(lài)的微服務(wù)接口。而在具體使用的時(shí)候就跟調(diào)用本地方法一點(diǎn)的進(jìn)行調(diào)用即可。由于 Feign 是基于 Ribbon 實(shí)現(xiàn)的,所以它自帶了客戶端負(fù)載均衡功能,也可以通過(guò) Ribbon 的 IRule 進(jìn)行策略擴(kuò)展。另外,F(xiàn)eign 還整合的 Hystrix 來(lái)實(shí)現(xiàn)服務(wù)的容錯(cuò)保護(hù)。

感謝各位的閱讀,以上就是“如何使用Eureka搭建簡(jiǎn)單的服務(wù)端注冊(cè)服務(wù)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何使用Eureka搭建簡(jiǎn)單的服務(wù)端注冊(cè)服務(wù)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI