nacos服务治理
服务注册+服务发现
启动nacos
win: startup.cmd
linux:startup.sh
账号密码:nacos 、nacos
服务注册
启动两个服务
服务发现
provider为服务名
//自动转载,所以直接用
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/instances")
public List<ServiceInstance> instances(){
List<ServiceInstance> provider = this.discoveryClient.getInstances("provider");
return provider;
}
Ribbon负载均衡
默认是轮询算法,还有随机算法,基于权重的算法
@LoadBalanced该注解起到的作用
这里调用利用到了restTemplate
@Configuration
public class ConsumerConfiguration {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
@RestController
@Slf4j
public class ConsumerController {
//自动转载,所以直接用
@Autowired
private DiscoveryClient discoveryClient;
//不会自动装载,不能直接用
@Autowired
private RestTemplate restTemplate;
//getForObject第一个参数调用接口,第二个接收返回的类型
@GetMapping("/index")
public String index(){
return this.restTemplate.getForObject("http://provider/index", String.class);
}
}
随机的算法
provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
基于权重的算法 根据nacos控制台里面设置的权重
第一步:
package com.lin.configuration;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.ribbon.NacosServer;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@Slf4j
public class NacosWeightedRule extends AbstractLoadBalancerRule {
@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
//读取配置文件
}
@Override
public Server choose(Object o) {
ILoadBalancer loadBalancer = this.getLoadBalancer();
BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) loadBalancer;
//获取要请求的微服务名称
String name = baseLoadBalancer.getName();
//获取服务发现的相关API
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
try {
Instance instance = namingService.selectOneHealthyInstance(name);
log.info("选择的实例是port={},instance={}",instance.getPort(),instance);
return new NacosServer(instance);
} catch (NacosException e) {
e.printStackTrace();
return null;
}
}
}
第二步:
provider:
ribbon:
NFLoadBalancerRuleClassName: com.lin.configuration.NacosWeightedRule
Sentinel服务限流降级
雪崩效应:A服务挂了,B服务需要调用A,这时候会有很多线程被阻塞,造成B服务也挂了
解决方案:
1.设置线程超时
2.设置限流(比如超过10个流量就限流)
3.熔断器Sentinel
熔断器原理
降级:只提供部分功能,应对自身的故障
限流:只接收系统能够承载的访问量,如果超出直接抛出异常
熔断:调用不了别人的功能,会抛出异常
点击流控,然后设置
上图阈值为1,则一秒一次
流量模式:
-
直接
直接限制/index -
关联
/list超过流量,则限制/index
-
链路
入侵service层,监控service
需要在service层中加入@SentinelResource注解实现
@Service
public class ProviderService {
@SentinelResource("test")
public void test(){
System.out.println("test");
}
}
流控:
- 快速失败:直接抛异常
- warm up:设置预热时间(秒):设置的时间内是单击阈值的1/3,过了设置时间后会恢复
- 排队等待:设置超时时间(毫秒):不会立马抛异常,而是等设置的时间过后再去调用
降级
RT
单个请求的响应时间超过阈值,则进入准降级状态,接下来的1s内连续5个请求响应都超过阈值,就进行降级,抛出429,持续时间为时间窗口的值
异常比例
每秒异常数量占通过量的比例大于阈值,就进行降级处理,持续时间为时间窗口的值
异常数
一分钟内的异常数,超过阈值就会降级,时间窗口要大于60s,否则刚结束熔断又要进入下一次熔断了
热点
需要添加 @SentinelResource注解实现
@GetMapping("/hot")
@SentinelResource("hot")
public String hot(
@RequestParam(value = "num1",required = false) Integer num1,
@RequestParam(value = "num2",required = false) Integer num2){
return num1+"-"+num2;
}
授权
是通过获取url里的参数name,然后根据这个值判断,设置白名单,就是只允许白名单的访问,
设置黑名单,就是只有黑名单的不能访问
SpringCloud Gateway服务网关
传达室就相当于网关
SpringCloud Gateway是基于Netty实现的,所以过程中不能用Servlet的组件
这个组件也可以配合Sentinel实现路由的限流
Seata分布式事务
通过全局事务通知本地事务进行回滚 undo_log记录需要回滚是操作
需要在nacos-config.txt配置服务。。。。一些列配置
然后在需要的地方添加@GlobalTransactional注解
Feign
Feign是伪Http客户端,它使得调用远程服务就像调用本地服务一样,只需要创建一个接口并实现一个注解即可
定义一个接口:
注入需要的业务调用即可
Feign集成了Nacos,在Nacos下使用Feign默认实现了负载均衡的效果
总结
-
服务治理:nacos
包括了服务注册、服务发现 服务注册就是把自身服务信息注册到注册中心中 服务发现就是去请求把已注册的服务 -
服务调用 :Fegin
-
服务网关:SpringCloud Gateway
SpringCloud Gateway是基于Netty实现的,所以过程中不能用Servlet的组件,这个组件也可以配合Sentinel实现路由的限流,也可以实现API网关的功能 -
服务容错:Sentinel
预防雪崩效应(A服务挂了,B服务调用A,会造成B阻塞很多线程,造成B服务也挂了) -
负载均衡:Ribbon
默认是轮询算法,还有随机算法,基于权重的算法
- 分布式事务:Seata
使用@GlobalTransactional注解