SpringCloud-Ribbon负载均衡&Feign声明式服务调用

SpringCloud-Ribbon负载均衡&Feign声明式服务调用

----------------------------------------负载均衡Ribbon----------------------------------------

一、ribbon的介绍

    1、什么是ribbon?

        ribbon是基于***flix ribbon实现的一个工作在consumer端的负载均衡工具,提供了很多负载均衡策略:轮询、随机

    2、ribbon的启动器

        nacos已经集成了ribbon,故无启动器

二、ribbon的入门案例

    1、开启ribbon

        @Bean
        /**
         * 原理:
         *  ①拦截器---------"ribbon-provider"----------->List<Service> serviceList
         *  ②使用ribbon的负载均衡算法-------------serviceList-------------->Service.
         *  ③把url中的map的key替换为ip、port
         */
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }

    2、调用provider

        //把ip和port换成map的key
        String url = "http://ribbon-provider/provider/getUserById/"+id;

    3、指定负载均衡策略

        @Bean
        public IRule iRule(){
            return new RandomRule();
        }

三、ribbon的问题

    手动拼接url和参数显得好傻

----------------------------------------声明式服务调用Feign----------------------------------------

一、Feign的介绍

    1、什么是Feign?

        feign是springcloud提供的声明式模板化(接口)的http客户端(工作在consumer端口)
        feign支持springmvc注解
        feign集成了ribbon也支持负载均衡
        feign = RestTemplate + ribbon

    2、feign的启动器

        spring-cloud-starter-openfeign

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

二、Feign的入门案例

    1、创建feign_provider

        拷贝ribbon_provider_1
        .......

    2、创建feign_interface

        1)pom.xml

            spring-cloud-starter-openfeign
            springcloud_***mon

        2)feign接口

            package ***.hg.feign;

            @FeignClient("map的key")
            @RequestMapping("/provider")
            public interface UserFeign{
                @RequestMapping("/getUserById/{id}")
                public User getUserById(@PathVariable("id") Integer id);
            }

    3、创建feign_consumer

        1)拷贝ribbon_consumer

        2)pom.xml

            feign_interface

       3)controller

            @Autowired
            private UserFeign userFeign;

        4)app

            @EnableFeignClients//开启feign注解扫描

三、feign的工作原理

    1、扫描feign接口

        @EnableFeignClients开启feign注解的支持:FeignClientsRegistrar.registerFeignClients()扫描添加了@FeignClient注解的接口,并生成代理类交给spring的ioc容器去管理

    2、代理类做的事

        SynchronousMethodHandler.invoke():创建RequestTemplate(HttpMethod、UriTemplate、Body)

四、feign的传参方式

    1、restful参数

        @PathVariable("id")   //例如:/getUserById/520

    2、?传参

        @RequestParam("id")   //例如:/updateUserById?id=520

    3、pojo

        @RequestBody   //例如:{id:250, name:"刘亦菲", age:18}

五、feign优化

    1、开启feign的日志

        logging:
          level:
            ***.hg.feign: debug #log4j的日志级别,“***.hg.feign”feign的包名
        feign:
          client:
            config:
              default:
              #feign-provider:
                loggerLevel: full #开启feign的日志

    2、GZIP压缩

        ①开启浏览器和consumer之间的压缩
            server:
              ***pression:
                enabled: true #开启浏览器--->consumer的gzip压缩
        ②开启consumer和provider之间的压缩
            feign:
              ***pression:
                request:
                  enabled: true #开启consumer--->provider的gzip压缩
                response:
                  enabled: true

    3、http连接池

        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

    4、负载均衡

        @Configuration
        public class FeignConfig {

            @Bean
            public IRule iRule(){
                return new WeightedResponseTimeRule();
            }
        }

    5、feign超时

        方式一:
            ribbon:
              ReadTimeout: 5000 # 请求连接的超时时间
              ConnectionTimeout: 5000 # 请求处理的超时时间
        方式二:
            feign:
              client:
                config:
                  #default:
                  feign-provider:
                    ConnectTimeout: 5000 # 请求连接的超时时间
                    ReadTimeout: 5000 # 请求处理的超时时间

转载请说明出处内容投诉
CSS教程网 » SpringCloud-Ribbon负载均衡&amp;Feign声明式服务调用

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买