Ribbon负载均衡&声明式服务调用feign

发布于:2022-11-10 ⋅ 阅读:(366) ⋅ 点赞:(0)

负载均衡Ribbon

什么是负载均衡 :负载均衡(Load Balance)其意思就是服务(访问请求)分摊到多个操作单元(服务器,组件 )上进行执行

  1、什么是ribbon?

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

2、ribbon的启动器

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

ribbon入门案例

 1、开启ribbon的负载均衡:
        @Bean
        @LoadBalanced //原理:①拦截器-->List<Service> ②负载均衡算法--->Service  ③把url中的服务名替换为ip、port

 2、调用provider 

  3、指定负载均衡算法

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

 声明式服务调用Feign

1.什么是feign

  •     feign是springcloud提供的声明式(接口),模板化 HTTP客户端(工作在consumer端)
  •     feign支持了springMVC注解
  •     feign继承了Ribbon也支持负载均衡

2.feign的入门案例

 1.创建 feign_provider 服务提供者:

pom.xml的依赖

    <dependencies>
        <dependency>
            <groupId>com.bjpowernode</groupId>
            <artifactId>feign_interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

application.yml

server:
  port: 8081
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.88.132:8848
  application:
    name: feign-provider

FeignProviderApp

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

controller

@RestController
@RequestMapping("/provider")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        return userService.getUserById(id);
    }

userService

public interface UserService {
    User getUserById(Integer id);

userServiceImpl

@Service
public class UserServiceImpl implements UserService {
    @Override
    public User getUserById(Integer id) {
        return new User(id,"张三","男",18);
    }

2.创建 feign_interface接口

pom.xml

<dependencies>
        <dependency>
            <groupId>com.bjpowernode</groupId>
            <artifactId>springcloud_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

创建一个userFeign接口

@FeignClient(value = "feign-provider")
@RequestMapping("/provider")
public interface UserFeign{

    @RequestMapping("/getUserById/{id}")
    User getUserById(@PathVariable("id") Integer id);

3.创建 feign_consumer服务消费者

pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.bjpowernode</groupId>
            <artifactId>feign_interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.bjpowernode</groupId>
            <artifactId>springcloud_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

application.yml 配置文件

server:
  port: 8080
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.88.132:8848
  application:
    name: feign-consumer

FeignConsumerApp启动类

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //开启feign接口扫描
public class FeignConsumerApp {
    public static void main(String[] args) {
        SpringApplication.run(FeignConsumerApp.class,args);
    }
}

controller

@RestController
@RequestMapping("/consumer")
public class ConsumerController {

    @Autowired
    private UserFeign userFeign; 

    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        return userFeign.getUserById(id);
    }

4.测试

 3.feign的工作原理

1.扫描feign接口生成代理类并交给spring容器去管理

 @EnableFeignClient开启feign注解扫描:FeignClientsRegistrar.registerFeignClients()扫描被     @FeignClient标识的接口并生成代理类, 再把代理类交给spring的容器去管理

2.为接口的方法创建requestTemplate

  当consumer调用feign接口的代理类时,会调用SynchronousMethodHandler.invoke()创建RequestTemplate(HttpMethod、UriTemplate、Body)

 3.发送请求

代理类会通过requestTemplate创建request对象,然后client(HttpClient、URLConnect、OkHttp)使用request发送请求

4.Feign的传参方式

1.restful风格:

feign接口:@PathVarible 【拼接restful形式的url】

2. ?传参:

feign接口:@RequestParam 【拼接?形式的url】

3.pojo传参:

provider: @RequestBody User user【获取请求体中的json字符串】

5.feign优化

1.feign日志的级别:

OpenFeign 提供了日志增强功能,它的日志级别有以下几个:

NONE:默认的,不显示任何日志。

BASIC:仅记录请求方法、URL、响应状态码及执行时间。

HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息。

FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。

2.开启feign的日志

6. http连接池

   

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

7.GZIP 压缩

 server:
          port: 80
          compression:
            enabled: true #开启浏览器<---->consumer的gzip压缩
        feign:
          compression: #开启feign<---->provider的gzip压缩
            request:
              enabled: true
            response:
              enabled: true

8.Feign请求超时

设置feign超时时间

ribbon:
  ConnectTimeout: 5000 #请求连接的超时时间
  ReadTimeout: 5000 #请求处理的超时时间

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到