四、微服务框架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

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

(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的配置(默认和自定义配置)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 为什么需要服务发现 简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基...
    谦小易阅读 25,166评论 4 93
  • 微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务。但如果要将微服务架构运用到生产项目上,并且能够发挥...
    java菜阅读 2,975评论 0 6
  • 微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务。但如果要将微服务架构运用到生产项目上,并且能够发挥...
    程序员技术圈阅读 2,801评论 10 27
  •  通过前面两章对Spring Cloud Ribbon和Spring Cloud Hystrix的介绍,我们已经掌...
    Chandler_珏瑜阅读 213,864评论 15 140
  • 翠湖里的花最为缤纷和娇艳了,除了蝴蝶花和三角梅,其他的姹紫嫣红我都认不得了,只好在翠湖里的花影中迷醉着…… 汪曾祺...
    听风66699阅读 342评论 0 1