之前说过了Eureka-Server的作用以及单机和集群的配置,这篇来说一说Eureka-Client与之间通过Feign来调用其他服务。
Feign是受Retrofit,JAXRS-2.0和WebSocket启发的Java到HTTP客户端绑定程序。Feign的第一个目标是降低与DeSTfulness无关的将Denominator统一绑定到HTTP API的复杂性。
Feign使用Jersey和CXF之类的工具为ReST或SOAP服务编写Java客户端。此外,Feign允许您在诸如Apache HC之类的http库之上编写自己的代码。Feign通过可定制的解码器和错误处理功能,以最小的开销和代码将代码连接到http API,这些错误和错误处理可以写入任何基于文本的http API。
Feign通过将注释处理为模板化请求来工作。在输出之前,参数以简单的方式应用于这些模板。尽管Feign仅限于支持基于文本的API,但它极大地简化了系统方面,例如重播请求。此外,Feign知道这一点后,就可以轻松对转换进行单元测试。
Eureka的发挥需要由Server、Client配合使用,Client会将自己注册到Server,由Server调度。接下来的案例会以服务注册中心
、服务提供者
、服务消费者
这三个角色加上Feign的作用来发挥一点Eureka作用。
本案例使用Spring-Cloud Hoxton.SR5 版本
首先引入需要的依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
配置服务
spring:
application:
name: spring-cloud-producer
server:
port: 9000
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
给启动类添加@EnableDiscoveryClient
注解
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudProducerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudProducerApplication.class, args);
}
}
创建HelloController
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(String name, HttpServletRequest request) {
int port = request.getServerPort();
return "hello " + name + ", this is " + port + " first message";
}
}
同样需要引入eureka-client依赖,除此之外还需要引入服务提供者没有的Feign的依赖。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
配置服务
spring:
application:
name: spring-cloud-consumer
server:
port: 9001
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
启用Feign和Eureka-Client
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class SpringCloudConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsumerApplication.class, args);
}
}
@EnableFeignClients
用来启用feign的远程调用Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
创建HelloController、HelloService
Controller中注入远程调用服务,正常调用方法。
@RestController
public class HelloController {
@Autowired
HelloService helloService;
@RequestMapping("/hello/{name}")
public String hello(@PathVariable String name) {
return helloService.hello(name) + this.hello;
}
}
HelloService
需要用@FeignClient
注解声明这个接口中的方法是需要调用远程服务的
@FeignClient(name = "spring-cloud-producer")
public interface HelloService {
@RequestMapping(value = "/hello")
String hello(@RequestParam(value = "name") String name);
}
name
属性与服务提供者的spring.application.name
一致将eureka-server、服务提供者、服务消费者依次启动,这时访问Eureka-Server就会看到有两个可用服务:SPRING-CLOUD-PRODUCER
、SPRING-CLOUD-CONSUMER
访问http://localhost:9001/hello/eureka-feign
,会收到hello eureka-feign, this is 9000 first message
返回。
将服务提供者的端口改为9002
,按上一篇里介绍的方法再次启动一个服务(#idea多实例启动),然后访问http://localhost:9001/hello/eureka-feign
,经过多次访问就可以发现,hello eureka-feign, this is 9000 first message
和hello eureka-feign, this is 9002 first message
交替返回,这就是eureka为我们默认实现了负载均衡。
至此,关于Eureka的使用以及微服务中服务之间的调用已经说完了,接下来是Spring-Cloud中的熔断器Hystrix。
下一篇:Spring-Cloud Hystrix 服务熔断及仪表盘使用
纯洁的微笑:springcloud(三):服务提供与调用
运行源码的某一个服务时请将与本节不相关的功能注释掉,避免启动失败。
码云:spring-cloud-demo