2020是大版本,2021是在2020的基础上小的升级
参考:
https://blog.csdn.net/alisystemsoftware/article/details/111935236
https://blog.csdn.net/u013277209/article/details/111610862
旧版本的 spring-cloud-netflix-dependencies
管理着 Netflix 所有组件,包括 Hystrix、Ribbon、Zuul、Eureka 等。而自 2020.0 版本起它有且只管理 Eureka
(包括 Server 和 Client)
Spring Cloud 2020.0.0 作为一个主要版本,带来了众多显著的变化,其中进行了一些阻断式更新(不向下兼容)
组件替代方案
在消费者
springcloud-consumer-dept-80
模块的 pom.xml 中导入
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
- 只需要导入
spring-cloud-starter-netflix-eureka-client
即可(父工程中有版本号)- 里面包含了
LoadBalancer
spring-cloud-starter-netflix-ribbon
这个包不需要再导入;自SpringCloud 2020起,已经舍弃了ribbon
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
<version>2.2.10.RELEASEversion>
dependency>
# 配置eureka
eureka:
client:
# 消费者需要从注册中心获取服务,也要连接注册中心
# 因为不是服务提供者,不需要向注册中心注册,所以为 false
register-with-eureka: false
# 注册中心地址
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
@EnableEurekaClient
主启动类加上
@EnableEurekaClient
注解,开启Eureka
@SpringBootApplication
@EnableEurekaClient
public class DepartmentConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(DepartmentConsumer_80.class,args);
}
}
@LoadBalanced
自定义Spring配置类:ConfigBean.java 配置负载均衡实现RestTemplate,添加
@LoadBalanced
注解使用
RestTemplate
和RestOperations
都可以;建议用新版RestOperations
@Configuration
public class ConfigBean {
/**
* @LoadBalanced 配置负载均衡实现RestTemplate
*/
//public RestTemplate getRestTemplate(){
// return new RestTemplate();
//}
@LoadBalanced
@Bean
public RestOperations getRestTemplate(RestTemplateBuilder builder){
return builder.build();
}
}
@Autowired
//private RestTemplate restTemplate;
// 选用 RestOperations
private RestOperations restTemplate;
/**
* 服务提供者基础路径
*/
//private static final String REST_URL_PREFIX = "http://localhost:8001";
// 通过服务名来访问;服务名不区分大小写
private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";
服务名:
- 不区分大小写
- 服务名指的是服务提供者的yml文件中配置信息
spring:
application:
# 服务名称
name: springcloud-provider-dept
springcloud-provider-dept-8002
和springcloud-provider-dept-8003
与
springcloud-provider-dept-8001
一样,提供同样的服务
# spring
spring:
application:
# 服务名称一样
name: springcloud-provider-dept
不同之处
每个服务端口不同:分别为 8001
、8002
、8003
每个服务连接的数据源不同
需要三个数据库:springcloud_db01
,springcloud_db02
,springcloud_db03
分别修改 DepartmentMapper.xml
中的SQL语句
如:
insert into springcloud_db01.department(dept_name, db_source) VALUES (#{deptName},DATABASE())
连接各自的数据库
MyInfo.java
:修改服务的info信息
主启动类名称不同
Ribbon 中的算法实现类有多种;但已经舍弃
LoadBalancer
中的算法实现类只有两种:RoundRobinLoadBalancer
, RandomLoadBalancer
;可以自定义切换随机算法
LoadBalancer
成功的基础上做如下修改官方建议:
- 不与主启动类在同级目录
- 可以建在主启动类的上级目录下;目的是不让
@SpringBootApplication
或@ComponentScan
扫描到- 不要加
@Configuration
注解
提示:
经过测试,建立同级目录下,或者加上
@Configuration
之后,也可以;但可能会造成其它问题,没有深入探究
//@Configuration 不要加这个注解
public class CustomLoadBalancerConfiguration {
@Bean
ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
System.out.println("随机=============");
return new RandomLoadBalancer(loadBalancerClientFactory
.getLazyProvider(name, ServiceInstanceListSupplier.class),
name);
}
}
@LoadBalancerClient
- 在
@SpringBootApplication
能扫描的范围内设置配置RestOperations
的配置类@LoadBalancerClient(name = "SPRINGCLOUD-PROVIDER-DEPT", configuration = CustomLoadBalancerConfiguration.class)
@Configuration
@LoadBalancerClient(name = "SPRINGCLOUD-PROVIDER-DEPT", configuration = CustomLoadBalancerConfiguration.class)
public class ConfigBean {
@LoadBalanced
@Bean
public RestOperations getRestTemplate(RestTemplateBuilder builder){
return builder.build();
}
}
解析:
请求服务SPRINGCLOUD-PROVIDER-DEPT
时,执行CustomLoadBalancerConfiguration
中定义的算法
测试前:使用meven的
clean
清理项目、清理浏览器缓存、重启注册中心、服务提供者、服务消费者