在上一个篇幅中,介绍了Spring Cloud Eureka服务的使用。本文将介绍如何如何使用Eureka Client来注册服务,并如何使用OpenFeigh来调用对应的注册服务。
Eureka Client简单来说,就是一个提供服务,并注册到Cureka Server仓库上的一个组件。
创建Eureka Client,需要做如下准备工作:
spring-cloud-starter-netflix-eureka-client @EnableEurekaClient
简单地HTTP 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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.netease.nis.cloud</groupId>
<artifactId>consumer-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<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>
<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>
比如,我们在一台机器上启动三个Eureka Client实例,分别绑定8881,8882,8883三个不同的端口,启动后这三个实例都会注册到Eureka Server上,那么application.yml的配置信息如下:
spring:
application:
name: spring-cloud-eureka-client
eureka:
client:
serviceUrl:
defaultZone: http://netease-dev.com:9801/eureka/,http://netease-dev.com:9802/eureka/,http://netease-dev.com:9803/eureka/
---
spring:
profiles: client1
server:
port: 8881
---
spring:
profiles: client2
server:
port: 8882
---
spring:
profiles: client3
server:
port: 8883
eureka:
instance:
hostname: peer3.com
---
然后,我们就分别启动三个不同端口上的实例:
java -jar eureka-client-0.0.1-SNAPSHOT.jar --spring.profiles.active=client1 java -jar eureka-client-0.0.1-SNAPSHOT.jar --spring.profiles.active=client2 java -jar eureka-client-0.0.1-SNAPSHOT.jar --spring.profiles.active=client3
从下图中,我们就可以看出已经注册了三个实例了。
OpenFeigh是一个注解声明式的web服务客户端,它使得调动注册REST服务更加方便。我们通过简单地在接口类上注解就可以轻松达到远程调用的目的,而且它还支持自定义的解码和编码器。
实际上,OpenFeigh本身也集成了Ribbon和Eureka,具有负载均衡的效果。
使用OpenFeigh,需要做如下的准备工作:
spring-cloud-starter-openfeign @EnableFeignClients @FeignClient
以下是一个配置OpenFeign的简单依赖配置:
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.netease.nis.cloud</groupId>
<artifactId>comsumer-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>comsumer-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</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>
接下来配置一下程序的参数(application.yml),其实大部分参数和Client区别不大:
eureka:
client:
registerWithEureka: false
# fetchRegistry: false
serviceUrl:
defaultZone: http://netease-dev.com:9801/eureka/,http://netease-dev.com:9802/eureka/,http://netease-dev.com:9803/eureka/
server:
port: 9000
spring:
application:
name: consumer-feign-client
为了调用之前写的注册微服务,我们需要编写一个接口,并添加注解,如下所示:
// GreetingClient.java
@FeignClient("spring-cloud-eureka-client")
public interface GreetingClient {
@RequestMapping("/hello")
String hello();
@RequestMapping("/good")
String good();
}
以上定义了2个接口,调用的注册服务名为spring-cloud-eureka-client,内部声明了两个接口,分别调用/hello和/good。然后我们在Controller中就可以使用了,如下:
@SpringBootApplication
@EnableFeignClients
@RestController
public class ComsumerClientApplication {
@Autowired
private GreetingClient greetingClient;
public static void main(String[] args) {
SpringApplication.run(ComsumerClientApplication.class, args);
}
@RequestMapping("/hello2")
public String hello2() {
String text = String.format("enhanced - %s", greetingClient.hello());
System.out.println(text);
return text;
}
@RequestMapping("/good2")
public String good2() {
String text = String.format("enhanced - %s", greetingClient.good());
System.out.println(text);
return text;
}
}
配置比较简单,我们用浏览器打开:
多刷新几次,然后可以看下日志,三个实例都有被调用,策略就是轮训的方式,达到负载的效果。
OpenFeigh 是支持断路器的,只需要确保Hystrix添加进来,并打开开关 feign.hystrix.enabled=true 即可。断路器的更多内容可以参考以下官网链接: