目錄
微服務:整合 Spring Cloud Eureka - 注冊中心 Eureka Server
微服務:整合 Spring Cloud Eureka - 服務注冊 Eureka Client
微服務:整合 Spring Cloud Eureka - 服務發現 DiscoveryClient
微服務:整合 Spring Cloud Eureka - 服務消費以及Ribbon簡單使用
微服務:整合 Spring Cloud Eureka - 高可用集群
微服務:整合 Spring Cloud Eureka - .NET Core Mvc Api (C#)
微服務:整合 Spring Cloud Eureka - 服務治理機制
微服務:整合 Spring Cloud Eureka - 服務事件監聽
微服務:整合 Spring Cloud Eureka - 高級屬性Region、Zone
微服務:整合 Spring Cloud Eureka - Rest接口文檔
微服務:整合 Spring Cloud Eureka - Security 安全保護
一、前言
本文主要是向大家簡單介紹如何使用 DiscoveryClient發現Eureka微服務注冊中心的服務信息。
前面幾篇文章向大家介紹了如何搭建Eureka Server 注冊中心,以及如何將服務注冊到Eureka微服務注冊中心進行管理。現在只差一個服務消費者,就可以構建出一個簡單的微服務框架。
二、服務發現
1、項目結構
2、父pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.demo</groupId> <artifactId>spring-cloud-register</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>demo-register</module> <module>demo-service-provider</module> <module>demo-service-consumer</module> </modules> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR1</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.4.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <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> </project>
2、demo-service-consumer的pom.xml 配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>spring-cloud-register</artifactId> <groupId>com.demo</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>demo-service-consumer</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- eureka-client 服務注冊與發現 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- eureka-client 服務注冊與發現 --> <!-- ribbon 負載均衡 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <!-- ribbon 負載均衡 --> </dependencies> </project>
3、demo-service-consumer的啟動類:ServiceConsumerApplication
package com.demo.service.consumer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class ServiceConsumerApplication { public static void main(String[] args) { SpringApplication.run(ServiceConsumerApplication.class, args); } }
4、demo-service-consumer : application.yml
server:
port: 8201
spring:
application:
name: demo-service-consumer
eureka:
instance:
lease-renewal-interval-in-seconds: 20
client:
register-with-eureka: true
fetch-registry: true
instance-info-replication-interval-seconds: 30
registry-fetch-interval-seconds: 10
serviceUrl:
defaultZone: http://localhost:8001/register/eureka/
上述配置指定了應用端口號為8201,服務名稱為demo-service-consumer(別的微服務可以通過這個名稱從注冊中心獲取demo-service-consumer提供的服務),剩下的為Eureka相關配置,含義如下:
1、eureka.instance.lease-renewal-interval-in-seconds,向Eureka 服務端發送心跳的間隔時間,單位為秒,用於服務續約。這里配置為20秒,即每隔20秒向febs-register發送心跳,表明當前服務沒有宕機;
2、eureka.client.register-with-eureka, 為true時表示將當前服務注冊到Eureak服務端;
3、eureka.client.fetch-registry,為true時表示從Eureka 服務端獲取注冊的服務信息;
4、eureka.client.instance-info-replication-interval-seconds,新實例信息的變化到Eureka服務端的間隔時間,單位為秒;
5、eureka.client.registry-fetch-interval-seconds,默認值為30秒,即每30秒去Eureka服務端上獲取服務並緩存,這里指定為10秒的原因是方便開發時測試,實際可以指定為默認值即可;
6、eureka.client.serviceUrl.defaultZone,指定Eureka服務端地址。
5、demo-service-consumer : DiscoveryServiceController
package com.demo.service.consumer.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class DiscoveryServiceController { @Autowired private DiscoveryClient discoveryClient; @ResponseBody @GetMapping("/getInstances/{serviceId}") public List<ServiceInstance> getInstances(@PathVariable("serviceId") String serviceId) { List<ServiceInstance> list = discoveryClient.getInstances(serviceId); System.out.println("------------------------------------"); if (list != null && list.size() > 0) { for (ServiceInstance instance : list) { System.out.println(""); System.out.println("******************************"); System.out.println("服務實例信息:"); System.out.println("服務 ServiceId:" + instance.getServiceId()); System.out.println("服務 Host:" + instance.getHost()); System.out.println("服務 Port:" + instance.getPort()); System.out.println("服務 Uri:" + instance.getUri().toString()); System.out.println("服務 Metadata:" + instance.getMetadata().toString()); System.out.println("******************************"); System.out.println(""); } } else { System.out.println("未找到serviceId:" + serviceId + "的實例"); } System.out.println("------------------------------------"); return list; } @ResponseBody @GetMapping("/getServices") public List<String> getServices() { List<String> list = discoveryClient.getServices(); System.out.println("------------------------------------"); if (list != null && list.size() > 0) { for (String serviceId : list) { System.out.println("服務Id : " + serviceId); } } else { System.out.println("注冊中心無服務實例"); } System.out.println("------------------------------------"); return list; } }
三、運行分析
1、第一步啟動Eureka注冊中心 - demo-register,可以參考《微服務:整合 Spring Cloud Eureka - 注冊中心 Eureka Server》。
2、第二步啟動服務提供者 - demo-service-provider,可以參考 《微服務:整合 Spring cloud Eureka - 服務注冊 Eureka Client 》。
我們可以啟動兩個 demo-service-provider實例,以便觀察效果
3、第三步啟動服務消費者 - demo-service-consumer。
4、打開Eureka注冊中心:http://localhost:8001/register/
我們可以開到Eureka注冊中心現在已經注冊了三個實例,其中demo-service-provider兩個,demo-service-consumer一個。
localhost:demo-service-provider:8101
localhost:demo-service-provider:8102
localhost:demo-service-consumer:8201
6、打印服務列表,在瀏覽器中打開:http://localhost:8201/getServices
我們可以在瀏覽器中查看到返回的是一段Json數據:
[ "demo-service-provider", "demo-service-consumer" ]
Idea的控制台輸出為:
也就是說,Eureka注冊中心只有兩個ServiceId,但是卻有三個服務實例。因為demo-service-provider啟動了兩個實例,那么ServiceId=demo-service-provider的實例就有兩個。
3、打印Eureka注冊中心中ServiceId=demo-service-provider的服務實例信息,打開瀏覽器輸入:http://localhost:8201/getInstances/demo-service-provider
idea的控制台輸出為:
四、總結
以上就是DiscoveryClient的用法,我們可以通過DiscoveryClient從Eureka注冊中心獲取服務提供者的服務實例信息。例如我們通過DiscoveryClient發現demo-service-provider的實例有兩個,也就是說有兩個url地址:localhost:8101、localhost:8102。通過這兩個地址,服務消費者可以通過負載均衡策略選擇其中一個服務地址進行調用。
下一篇將會介紹服務消費以及微服務中間件:負載均衡- ribbon