本文使用的技术是springcloud alibaba + nacos + Ribbon + openFeign + sentinel + sleuth + zipkin
不了解可以返回上一篇文章
https://blog.csdn.net/qq_36611929/article/details/121115548?spm=1001.2014.3001.5502
搭建之前请先选好版本 spring cloud alibaba 和 springboot 的版本对应关系
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
创建maven父级项目,修改父级pom文件 !!!注意版本对应关系
代码如下(示例):
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.6.RELEASEversion>
parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Hoxton.SR8version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.2.5.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
代码如下(示例):
下载nacos 官网地址 https://nacos.io/zh-cn/
启动命令(standalone代表着单机模式运行,非集群模式):
Linux/Unix/Mac
> sh startup.sh -m standalone
Windows
> startup.cmd -m standalone
启动成功访问 localhost:8848/nacos
添加nacos依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
在 application.properties 中配置 Nacos server 的地址
server.port=8070
spring.application.name=service-provider // 注意不要用下划线_,会报错服务找不到
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
启动类添加注解
@SpringBootApplication
@EnableDiscoveryClient //通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能
public class NacosProviderApplication{...}
添加依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
dependency>
/**
* 添加LoadBalanced,使RestTemplate以负载均衡的方式调用服务
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
@GetMapping("/sayHello")
public String sayHello(String name){
String url = "http://provider-service/hello?name=" + name;
String result = restTemplate.getForObject(url , String.class);
return result;
}
负载均衡配置
更换负载均衡方式
@Bean // 方法一,通过配置文件方式
public IRule ribbonRule(){
return new RandomRule();
}
# 方法二,修改application.properties配置
product-goods.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
常用的策略
随机策略——RandomRule
轮询策略——RoundRobinRule Ribbon默认策略
重试策略——RetryRule
最低并发策略——BestAvailableRule
可用过滤策略——AvailabilityFilteringRule
响应时间加权策略——WeightedResponseTimeRule
每隔30秒计算一次服务器响应时间,以响应时间作为权重,响应时间越短的服务器被选中的概率越大。
区域权衡策略——ZoneAvoidanceRule
一:添加依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
二:启动类添加注解
@EnableFeignClients
public class OrderApplication{...}
三:添加接口 订单服务 >调用> 用户服务
@FeignClient(value = "product-users") //填写要调用的服务名称
public interface UserService {
@GetMapping("/user") // 服务下需要调用的接口
UserInfo queryUserInfo();
}
第一步:每个服务模块导入maven依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
第二步: application.properties 文件添加配置信息
#sentinel控制台注册服务
spring.cloud.sentinel.transport.dashboard=localhost:9090
#是否取消控制台懒加载
spring.cloud.sentinel.eager=true
修改项目配置文件
feign.sentinel.enabled=true # 开启feign对sentinel的支持
服务调用接口添加 fallback 异常处理类
@FeignClient(value = "product-goods",
//fallback = GoodsServiceFallback.class,
fallbackFactory = GoodsServiceFallbackFactory.class)
public interface GoodsService {
@GetMapping("/goods/")
Goods getGoods(@RequestParam(name = "gId") String gId);
}
编写异常处理类逻辑
@Component
public class GoodsServiceFallback implements GoodsService {
@Override
public Goods getGoods(String gId) {
Goods goods = new Goods();
goods.setId("-100");
goods.setGoodName("错误信息返回结果");
return goods;
}
}
编写异常处理类逻辑并打印错误信息
@Slf4j
@Service
public class GoodsServiceFallbackFactory implements FallbackFactory<GoodsService> {
@Override
public GoodsService create(Throwable throwable) {
return gId -> {
log.error("{}",throwable);
Goods goods = new Goods();
goods.setId("-100");
goods.setGoodName("错误信息返回结果");
return goods;
};
}
}
下载sentinel可视化工具 地址:https://github.com/alibaba/Sentinel/
使用文档 https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
启动命令
java -Dserver.port=9090 -Dcsp.sentinel.dashboard.server=localhost:9090 -
Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
spring cloud alibaba 集成 gateway
一:新建 spring boot 项目
1:Gatway必须需要SpringBoot2.X才能支持
2:Gatway底层依赖实现Netty和WebFulx,不同于我们servelt编程模型。
3:我们不能以tomcat这类容器来运行,建议打包成jar包运行。
4:pom文件(不能引入web包)
二:导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
dependencies>
三:启动类添加注解
@EnableDiscoveryClient
四:添加yml配置
server:
port: 7000
spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 注册gateway
gateway:
discovery:
locator:
enabled: true # 允许gateway 从 nacos 获取服务信息
# 路由配置 不是必须配置 有自己默认实现 默认实现访问地址为: ip:${server.port}/访问的服务名称/路径
routes:
- id: ${spring.application.name} #路由的id,保证唯一就行,常用服务名称
uri: lb://product-goods #想要代理的路由接口 lb 负载均衡 lb://服务名称
order: 1 #优先级 越小优先级越高
predicates: #断言:路由跳转需要满足的条件
- Path=/**
filters: # 在请求之前,对请求路径,信息做操作
一:父工程导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-sleuthartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
dependency>
dependencies>
二:在每个父工程配置中添加下面配置
#zipkin 服务的请求地址
spring.zipkin.base-url=http://localhost:9411
# 让 nacos 把它当作 URL 而不是服务
spring.zipkin.discovery-client-enabled=false
# 采样比例 1.0 也就是全部都需要 范围值 0 ~ 1
spring.sleuth.sampler.probability=1.0
三:数据持久化
执行mysql脚本 文档上面有
https://github.com/openzipkin/zipkin/tree/master/zipkin-storage/mysql-v1
四:下载zipkin ui模块
https://github.com/openzipkin/zipkin
五:启动命令
启动ui界面
不持久化启动
java -jar zipkin-server-*-exec.jar
持久化启动
java -jar zipkin-server-*-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --
MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=root