四、微服务框架spring cloud组件之声明式服务调用feign

  • 在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端。我们可以使用JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client, Spring的RestTemplate。但是,用起来最方便、最优雅的还是要属Feign了。Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。
  • feign的优势就是提供统一的抽象,通过接口来实现远程调用,更加符合我们的编程习惯。实际上feign就是对restTemplate和ribbon进一步封装,使之使用更加简单、高效。通过Feign, 我们能把HTTP远程调用对开发者完全透明,得到与调用本地方法一致的编码体验。这一点与阿里Dubbo中暴露远程服务的方式类似,区别在于Dubbo是基于私有二进制协议,而Feign本质上还是个HTTP客户端。如果是在用Spring Cloud Netflix搭建微服务,那么Feign无疑是最佳选择。

一、入门体验

1、搭建注册中心和服务提供者

(1)搭建eureka注册中心
server-url=http://localhost:8081/eureka/
(2)搭建eureka服务提供中心

  • spring.application.name=eureka-client
  • 提供restful方法为:
@RequestMapping("/hello/{name}")
    public String hello(@PathVariable String name){
        return "hello "+name;
    }

2、搭建服务消费中心(使用feign)

(1)一如feign相关包,老版本用spring-cloud-starter-feign,Finchley.SR1版本的用spring-cloud-starter-openfeign


            org.springframework.boot
            spring-boot-starter-web
        

(2)定义接口

/**
 * 定义一个feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务
 */
@FeignClient(name = "EUREKA-CLIENT")
public interface HelloService {
    @RequestMapping("/hello/{name}")
    String hello(@PathVariable("name") String name);
}

(3)创建controller并访问

@Autowired
    private HelloService helloService;
    @RequestMapping("/hello")
    public String hello(){
        return helloService.hello("qiu");
    }

(4)开启feign服务

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class RibbonConsumer1Application {
    public static void main(String[] args) {
        SpringApplication.run(RibbonConsumer1Application.class, args);
    }
}

(5)配置

server.port=8083
spring.application.name=feign-consumer
#向注册中心注册并获取相关的服务提供者信息
eureka.client.service-url.defaultZone=http://localhost:8081/eureka/

(6)测试

3、feign调用整个流程

1、首先通过@EnableFeignCleints注解开启FeignCleint
2、根据Feign的规则实现接口,并加@FeignCleint注解
3、程序启动后,会进行包扫描,扫描所有的@ FeignCleint的注解的类,并将这些信息注入到ioc容器中。
4、当接口的方法被调用,通过jdk的代理,来生成具体的RequesTemplate
RequesTemplate在生成Request
5、Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp
6、最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。

二、feign一些高级功能

  • 与ribbon搭配使用
  • 重试机制
  • 与hystrix搭配使用
  • 替换底层连接方式(比如替换成httpClient)
  • feign的配置(默认和自定义配置)

你可能感兴趣的:(四、微服务框架spring cloud组件之声明式服务调用feign)