Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon是基于客户端的负载均衡工具,也就是说我们只需要在服务消费者端进行配置,然后就可以通过负载均衡算法来获取服务,Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。
首先要创建多个服务提供者,每个服务都从不同的数据库中查询数据,这样我们就可以根据信息中数据库的不同来分辨出我们获取到了哪个服务提供者提供的服务
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集群搭建中),服务提供方,服务消费方
启动的服务有
打开eureka监控中心,我们可以看到三个服务提供方
用服务方进行查询
可以看到是从db03数据库查,然后刷新页面
是从db02数据库查
可以看到,同一个地址刷新,从不同的数据库中查看了数据,也就是说获取到了不同的服务,在开发的时候,只需要配置服务的名称
private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT"; //这里的名称就是服务提供方向eureka中注册的名字
不用关注服务的具体地址