1.Nacos配置管理

  1. Nacos除了可以做注册中心,同样可以做配置管理来使用。
  2. 当微服务数量多时,可以使用统一配置管理方案,来集中管理所有实例的配置
  3. 配置变更时,可以实现热更新

1.1Q1:如何在nacos中添加配置文件

将固定的配置尽量放在本地,需要热更新的配置放到nacos
image.png

Q2:如何从微服务拉取配置

  1. 微服务要拉取nacos中的配置,且与本地的配置文件合并,共同完成项目启动
  2. 问题1:如果不读取本地配置文件又如何知晓远程地址
  3. 答:Spring引入一个新的配置文件:bootstrap.yaml文件,会在本地配置文件被读取前优先读取

image.png

实例

  1. 1.导入nacos-config依赖
  2. 2.添加bootstrap.yaml
  3. 3.这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据
  4. ${spring.application.name}-${spring.profiles.active}.
  5. ${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置。
  6. 解释:如下图
  7. 4.controller层添加业务逻辑,读取nacos配置

image.png

1.2.配置热更新

  1. 不需要重启服务,既可以让修改的配置生效

配置热更新的两种方式

  • @Value注入的变量所在类上添加注解@RefreshScope
  • 使用@ConfigurationProperties注解代替@Value注解。

方法二

  1. package cn.itcast.user.config;
  2. import lombok.Data;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.stereotype.Component;
  5. @Component
  6. @Data
  7. @ConfigurationProperties(prefix = "pattern")
  8. public class PatternProperties {
  9. private String dateformat;
  10. }

在UserController中使用这个类代替@Value:
image.png

微服务启动时,会去nacos读取多个配置文件,例如:
- [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
- [spring.application.name].yaml,例如:userservice.yaml

而[spring.application.name].yaml不包含环境,因此可以被多个环境共享。

2.feign远程调用

1.使用restTemplet缺点

存在下面的问题:

•代码可读性差,编程体验不统一

•参数复杂URL难以维护

2.修改步骤

1)引入依赖spring-cloud-starter-openfeign
2)添加注解 :在order-service的启动类添加注解开启Feign的功能:@EnableFeignClients
3)编写Feign的客户端:在order-service中新建一个接口,内容如下:
package cn.itcast.order.client;

import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("userservice")
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}
4)使用FeignClient中定义的方法代替RestTemplate

2.2.自定义配置

2.2.1.配置文件方式:基于配置文件修改feign的日志级别可以针对单个服务:
feign:  
  client:
    config: 
      userservice: # 针对某个微服务的配置
        loggerLevel: FULL #  日志级别 
也可以针对所有服务:
feign:  
  client:
    config: 
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #  日志级别
2.2.2.Java代码方式
也可以基于Java代码来修改日志级别,先声明一个类,然后声明一个Logger.Level的对象:
public class DefaultFeignConfiguration  {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC; // 日志级别为BASIC
    }
}
如果要全局生效,将其放到启动类的@EnableFeignClients这个注解中:
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 
    如果是局部生效,则把它放到对应的@FeignClient这个注解中:
 @FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class)

2.3feign优化使用

总结,Feign的优化:

1. 日志级别尽量用basic

2.使用HttpClient或OKHttp代替URLConnection

①  引入feign-httpClient依赖

②  配置文件开启httpClient功能,设置连接池参数

3.Gateway服务网关

是什么:
服务的守门神,所有微服务的统一入口。
权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。

路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。

限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。

操作步骤

1)创建gateway服务,引入依赖
2)编写启动类
3)编写基础配置和路由规则
我们将符合Path 规则的一切请求,都代理到 uri参数指定的地址。

本例中,我们将 /user/**开头的请求,代理到lb://userservice,lb是负载均衡,根据服务名拉取服务列表,实现负载均衡。