springcloud--part3 : 服务消费者(feign)
摘自 方志朋博客(http://blog.csdn.net/forezp/article/details/69808079 )
spring cloud 中调用服务的方式之二---- 通过 Feign
一、Feign简介
Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。
简而言之:
Feign 采用的是基于接口的注解
Feign 整合了ribbon
Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。
简而言之:
Feign 采用的是基于接口的注解
Feign 整合了ribbon
Feign使得 Java HTTP 客户端编写更方便。Feign 灵感来源于Retrofit、JAXRS-2.0和WebSocket。Feign最初是为了降低统一绑定Denominator到HTTP API的复杂度,不区分是否支持Restful。Feign旨在通过最少的资源和代码来实现和HTTP API的连接。通过可定制的解码器和错误处理,可以编写任意的HTTP API。
工作机制
Feign通过配置注入一个模板化请求进行工作。只需在发送之前关闭它,参数就可以被直接的运用到模板中。然而这也限制了Feign,只支持文本形式的API,它可以在响应请求方面来简化系统。了解了这一点,这也非常容易进行你的单元测试转换。
二 准备工作
启动eureka-server,端口8761;
(设置 eureka.server.enable-self-preservation: 在eureka服务注册中心,将没有接收到心跳的服务自动剔除)
启动eureka-client 2次,端口分别是8762,8763;
三 创建feign服务
3.1 新建spring-boot module,取名service-feign;
3.2 导包 spring-boot-starter-web ; spring-cloud-starter-eureka ; spring-cloud-starter-feign;
3.3 配置application.yaml 配置文件,端口 8765;
server: port: 8765 spring: application: name: service-feign eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
3.4 在程序的主入口的类上加上@EnableFeignClients 这个注解,这个注解表示开启了feign负载均衡的功能;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //此注解开启feign功能
public class SpringCloudServiceFeignApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudServiceFeignApplication.class, args);
}
}
3.5 创建一个feign接口并通过注解@FeignClient(" 服务名")指定调用某个服务,再通过@RequestMapping(value="/hi", method=RequestMethod.GET) 表明调用 “ service-hi ” 这个服务的 “ /hi ” 这个接口;
@Service @FeignClient(value = "service-hi") //指的是调用service-hi这个服务 public interface SchedualServiceHi { @RequestMapping(value = "/hi",method = RequestMethod.GET) //调用service-hi这个服务的 /hi 这个接口 String sayHiFromClientOne(@RequestParam("name")String name); }
3.6 在web的Controller层,对外暴露一个 " /hello " 接口,通过上面定义的feign的客户端SchedualServiceHi 来消费服务
@RestController
public class HiController {
@Autowired
SchedualServiceHi schedualServiceHi;
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String sayHi(String name){
return schedualServiceHi.sayHiFromClientOne(name);
}
}
3.7 测试: 多次访问 http://localhost:8765/hello?name=zdj,页面会交替出现
hello,this port is : 8763 hello,this port is : 8762
说明: 达到了通过feign来实现负载均衡功能的效果。
问题摘录:
eg 1. “ 我的8763已经停掉了,为什么在注册中心还能看见呢,刷了好几遍一直都在 ”
eureka.server.enable-self-preservation=false关闭保护机制,确保注册中心可以将不可用的实例剔除
新手操作,仅用作学习笔记,如有不正确之处,望指正!