一、nacos
在nacos配置中改权重只是临时生效,在配置文件中改nacos的权重是永远生效
nacos的权重为0时,不会访问。
springclude中实现负载均衡的两种方式:
1.消费者端 loadBalancerClient调用(轮询)
2.在nacos中配置权重
若两者都配置以消费者端为准
在配置文件中进行权重配置:
cloud: nacos: discovery: weight: 0.1 #注意:如果权重修改为0,则该实例永远不会被访问
二、feign接口
(拷贝提供端的controller层)
(1)在接口上加@FeignClient 表明是一个feign接口(name ="BBB",path ="/api/demo2",contextld ="指定bean名,一般写接口名")
contextld ="指定bean名,一般写接口名",注入时用@Resource根据bean名称注入
接口中抽象方法的参数注解都不能省@RequestParam @PathVariable
@FeignClient(name = "BBB",path = "/test2",contextId = "feignDemo") public interface FeignDemo { @GetMapping public String getPhone(); @GetMapping("/a") public String getPhoneA(String phone); @GetMapping("/b/{phone}") public String getPhoneB(@PathVariable("phone") String phone); }
(2)启动类上加@EnableFeignClients 确保feign接口被扫描 为确保100%被扫到加(basePackages = "feign接口所在的包名路径")
(3)消费端注入依赖,feign接口
<!--读取feign-demo - mould--> <dependency> <groupId>org.example</groupId> <artifactId>feign-demo</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
feign:日志配置和超时配置
spring: cloud: loadbalancer: nacos: enabled: true openfeign: client: config: default: loggerLevel: full read-timeout: 2000 # 读取数据的超时时间设置为2s connect-timeout: 2000 # 建立连接的超时时间设置为2s # 将feign包下产生的日志的级别设置为debug logging: level: com.atguigu.feign: debug
开启负载均衡,会优先调用同集群的的节点,也会有权重比
spring: cloud: loadbalancer: nacos: enabled: true
三、环境隔离/空间命名:
nacos---namespace
spring: cloud: nacos: discovery: server-addr: localhost:8848 #nacos地址 cluster-name: 111 ## 配置服务所属集群 namespace: 2327d1b6-af0e-4905-b18f-0bafd22060e6 #配置服务实例所属名称空间
四、配置文件
(1):bootstrap.yml配置文件
spring: cloud: nacos: discovery: //注册中心 server-addr: localhost:8848 cluster-name: 111 //集群名 namespace: 2327d1b6-af0e-4905-b18f-0bafd22060e6 //命名空间 //配置中心 config: prefix: ${spring.application.name} #前缀 file-extension: yaml #后缀 namespace: 2327d1b6-af0e-4905-b18f-0bafd22060e6 //配置空间 server-addr: localhost:8848 //配置中心地址(可不配,同注册地址) application: name: AAA //注册中心的名字 profiles: active: prod #前缀-拼-后缀
(2)微服务集成配置中心
获取配置文件中自定义的a.b=456
两种方法:
一:使用@Value
必须搭配@RefreshScope//刷新配置文件
@Value("${a.b}") public String a; @GetMapping("/aaa") public String getA(){ return a; } 必须搭配@RefreshScope//刷新配置文件
二:(1)写一个配置类
@Component @ConfigurationProperties(prefix = "a") public class TestConfig { public String b; public String getB() { return b; } public void setB(String b) { this.b = b; } }
(2)注入
@Autowired private TestConfig testConfig; @GetMapping("/aaa") public String getA(){ return testConfig.b; }
五、网关 gateway:
server: port: 80 spring: application: name: gateway-demo cloud: nacos: discovery: server-addr: localhost:8848 namespace: 6731e546-f632-40e1-8b01-535b7a1a6e89 gateway: routes: - id: AAA #路由id,可以自定义,只要唯一即可 uri: lb://AAA #路由的目标地址 lb就是负载均衡,后面跟服务名称 predicates: - Path=/*/xxx/** #断言:路径匹配 - id: BBB uri: lb://BBB predicates: - Path=/*/yyy/**,/*/zzz/** discovery: locator: enabled: true
六、过滤器:filters
(1)局部过滤器(在配置文件中配置)
filters: - args: #局部过滤器只针对当前的id生效
(2)默认过滤器(在配置文件中配置)
default-filters: #如:可以在所有的请求头上加Truth, atguigu is good - AddRequestHeader=Truth, atguigu is good
(3)全局过滤器(写一个配置类进行配置)
请求---->过滤器---->拦截器---->controller层
请求到达网关在转发之前,会先经过过滤器,过滤器可以有多个
如:可以限流 校验是否登录
@Component //@Order public class TestFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { //exchange可以获取请求对象 ServerHttpRequest request = exchange.getRequest(); //获取响应对象 ServerHttpResponse response = exchange.getResponse(); //场景:看用户本次请求是否携带了一个叫token的参数 getQueryParams()可以获取url中的参数 通过key获取value //List<String> token = request.getQueryParams().get("token"); String token = request.getQueryParams().getFirst("token"); if (StringUtils.isEmpty(token)){ // 若用户没有携带.则拦截用户的请求返回状态码:401 response.setStatusCode(HttpStatusCode.valueOf(401)); return response.setComplete(); } // 若用户携带了token的参数放过请求转发给微服务---放行 return chain.filter(exchange); } @Override public int getOrder() { return 0;//数字越小优先级越高 可以换成@Order(1)注解 } }