服務發現與消費,其服務發現的任務是由Eureka的客戶端完成,而服務的消費任務由Ribbon、JerseyClient等完成,Ribbon是一個基於HTTP和TCP的客戶端負載均衡器;使用JerseyClient是一個基於HTTP的客戶端調用組件,需要需要增加負載均衡器,需要自己來實現,示例代碼如下:
-
創建一個Spring Boot 的基礎工程來實現服務消費者,並在pom.xml 中引入必須依賴項 spring-cloud-starter-eureka,引入 spring-cloud-starter-web 來實現Spring MVC 的REST服務進行測試
<?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>org.drsoft.consumer</groupId>
<artifactId>consumer-helloservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>consumer-helloservice</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
-
創建應用主類 ConsumerHelloserviceApplication ,通過 @EanbleDiscoveryClient 注解將應用注冊為Eureka 客戶端應用,以獲取服務發現的能力,代碼如下:
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerHelloserviceApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerHelloserviceApplication.class, args);
}
}
-
創建 ConsumerController 類,並實現 /consumer 接口,在接口中對服務的調用,這里使用的是服務的名而不是一個具體的地址,服務消費Java代碼:
@RestController
public class ConsumerController {
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping (value = "/consumer", method = RequestMethod.GET)
public String helloConsumer() {
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("org.drsoft.webservice.helloservice");
StringBuilder stringBuilder = new StringBuilder();
URI uri = null;
for (ServiceInstance instance : serviceInstanceList) {
stringBuilder.append("host=" + instance.getHost());
stringBuilder.append("port=" + instance.getPort());
stringBuilder.append("serviceId=" + instance.getServiceId());
stringBuilder.append("uri=" + instance.getUri());
stringBuilder.append("\n");
uri = instance.getUri();
}
String uriString = uri.toString() + "/hello/get";
stringBuilder.append("response body=" + new RestTemplate().getForEntity(uriString, String.class).getBody());
return stringBuilder.toString();
}
}
-
在 application.properties 中配置Eureka 服務注冊中心的位置,需要和服務提供者的一致,否則是無法發現服務的,同時設置該消費者的端口號,代碼如下:
server.port=8090
spring.application.name=consumer-helloservice
eureka.client.service-url.defaultZone=http://eurekaserver1:1111/eureka/,http://eurekaserver2:1112/eureka
-
啟動consumer-helloservice應用后,我們可以在Eureka信息面板中看到,我們實現的 CONSUMER-HELLOSERVICE 服務,訪問地址 http://localhost:8090/consumer 可以看到請求返回內容:
host=192.168.196.187port=8085serviceId=ORG.DRSOFT.WEBSERVICE.HELLOSERVICEuri=http://192.168.196.187:8085 response body=get ok