Ribbon的配置与使用实例

Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon是基于客户端的负载均衡工具,也就是说我们只需要在服务消费者端进行配置,然后就可以通过负载均衡算法来获取服务,Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。

Ribbon的配置与使用实例_第1张图片

 

首先要创建多个服务提供者,每个服务都从不同的数据库中查询数据,这样我们就可以根据信息中数据库的不同来分辨出我们获取到了哪个服务提供者提供的服务

1创建多个Module

.

每个pom文件中都需要添加eureka-client依赖

        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
            2.2.2.RELEASE
        

主要配置如下:(注意注释的内容)

8001

server:
  port: 8001   #服务端口号,另外两个module填8002,8003
mybatis:
  type-aliases-package: com.yan.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
spring:
  application:
    name: springcloud-provider-dept  #注册到eureka中的名称,三个module都一样,不用改变
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC  # provider_8001是从db01查 ,8002从db02查,注意这里的修改
    username: root
    password: root
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/  #注册中心地址
  instance:
    instance-id: springcloud-provider-8001  #eureka描述的状态名

8002 

server:
  port: 8002
mybatis:
  type-aliases-package: com.yan.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
spring:
  application:
    name: springcloud-provider-dept  #注册到eureka中的名称
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db02?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: root
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/  #注册中心地址
  instance:
    instance-id: springcloud-provider-8002  #eureka描述的状态名

 不要忘了启动类中的注解

@EnableEurekaClient 

服务提供者查询数据的mapper,service之类的就不再写出来了,主要是从数据库查询数据,正常编写就好

Controller


@RestController
public class DeptController {
    @Autowired
    private DeptService deptService;
    @PostMapping("/dept/add")
    public boolean addDept(Dept dept){
        return deptService.addDept(dept);
    }
    @GetMapping("/dept/{id}")
    public Dept queryById(@PathVariable("id") int id){
        return deptService.queryById(id);
    }
    @GetMapping("/dept/all")
    public List queryAll(){
        return deptService.queryAll();
    }
}

实体类 Dept

    private Integer deptno;  //部门编号
    private String deptname;  //部门名称
    //这个数据存在哪个数据库,微服务,一个服务对应一个服务器,同一个信息可能存在不同的数据库
    private String db_source;

2.服务消费方

引入依赖,消费者要用到Ribbon,所以要引入Ribbon依赖


        
            org.springframework.cloud
            spring-cloud-starter-netflix-ribbon
            2.2.2.RELEASE
        
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
            2.2.2.RELEASE
        

配置文件,主要是eureka 的配置

server:
  port: 80
eureka:
  client:
    register-with-eureka: false
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/

controller层的编写,不用写service层,注意看代码中注释的内容

    //消费者 不用编写Service层
    @Autowired
    private RestTemplate restTemplate;
    //通过Ribbon获取的时候,应该是一个变量,通过服务名来访问,不用通过地址访问
    //private static final String REST_URL_PREFIX = "http://localhost:8001";
    private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT"; //这里的名称就是服务提供方向eureka中注册的名字
    @GetMapping("/dept/{id}")
    public Dept queryById(@PathVariable("id") int id){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/"+id,Dept.class);
    }
    @PostMapping("/dept/add")
    public boolean addDept(Dept dept){
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,boolean.class);
    }
    @GetMapping("/dept/all")
    public List queryAll(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/all",List.class);
    }
}

创建一个配置类ConfigBean来向容器中提供一个RestTemplate

@Configuration
public class ConfigBean {
   /**
     * 负载均衡获得RestTemplate
     * RoundRobinRule 轮询
     * RandomRule  随机
     * AvailablityFilteringRule  会先过滤掉访问故障的服务,对剩下的进行轮询
     */
    @Bean
    @LoadBalanced  //默认轮询
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }


}

启动类添加注解

@EnableEurekaClient

然后启动eureka注册服务(eureka服务的代码在上篇文章eureka集群搭建中),服务提供方,服务消费方

启动的服务有

Ribbon的配置与使用实例_第2张图片

打开eureka监控中心,我们可以看到三个服务提供方

Ribbon的配置与使用实例_第3张图片

用服务方进行查询

可以看到是从db03数据库查,然后刷新页面

从db01 查,然后刷新

是从db02数据库查

可以看到,同一个地址刷新,从不同的数据库中查看了数据,也就是说获取到了不同的服务,在开发的时候,只需要配置服务的名称

    private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT"; //这里的名称就是服务提供方向eureka中注册的名字

不用关注服务的具体地址

 

你可能感兴趣的:(ribbon,eureka)