美文网首页
四、微服务框架spring cloud组件之声明式服务调用fei

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

作者: 小manong | 来源:发表于2019-03-31 22:13 被阅读0次
    • 在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的配置(默认和自定义配置)

    相关文章

      网友评论

          本文标题:四、微服务框架spring cloud组件之声明式服务调用fei

          本文链接:https://www.haomeiwen.com/subject/ubtumqtx.html