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使得 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关闭保护机制,确保注册中心可以将不可用的实例剔除



posted @ 2018-01-10 10:40  po~  阅读(1294)  评论(0编辑  收藏  举报