Nacos配置管理:
作用:将配置集中管理
实现配置的热更新(在配置变更时,及时通知微服务)
可以设置共享配置
实现步骤:
Ⅰ:在nacos的配置文件表单中填写配置信息
Data ID :(配置文件的id) 服务名称-环境名.后缀名
例:userservice-dev.yaml
Ⅱ:在服务的pom文件中引入nacos-config的客户端依赖
Ⅲ:在服务中添加bootstrap.yaml配置文件(包含了nacos中的配置文件名和nacos地址)
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
Ⅳ:添加业务逻辑代码,读取nacos配置
使用的注解 @Value(“${配置属性名}”)
————此时配置完成后无法进行热更新(即配置变更时,无法及时通知微服务)————
Ⅴ:配置热更新
方法一:在@Value注入的变量所在类上添加注解@RefreshScope
方法二:编写一个配置类,使用@ConfigurationProperties注解代替@Value注解读取nacos中的配置文件
配置共享:
原理: 微服务启动时会从nacos读取多个配置文件 { 服务名-profile.yaml、服务名.yaml },无论环境(profile)如何变化,服务名.yaml文件一定会加载,因此可以将多环境共享配置写入这个文件中。
优先级:nacos中的 服务名-环境名.yaml > nacos中的 服务名.yaml > 本地配置application.yml
补充:
项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
Feign远程调用:
作用:代替之前的RestTemplate发起远程调用(实现http请求的发送)
实现步骤:
Ⅰ:在服务消费者的pom文件中引入feign的依赖
Ⅱ:在服务消费者的启动类添加@EnableFeignClients注解开启Feign的功能
Ⅲ:在服务消费者中编写Feign客户端(接口)
例:
@FeignClient(“userservice”)
public interface UserClient {
//需要远程调那个就直接把对外接口复制过来(要添加上类上的路径)
@GetMapping(“/user/{id}”)
User findById(@PathVariable(“id”) Long id);
}
这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:
- 服务名称:userservice- 请求方式:GET- 请求路径:/user/{id}- 请求参数:Long id- 返回值类型:User
这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。
Ⅳ:使用FeignClient中定义的方法代替RestTemplate
Feign的自定义配置:
日志的级别分为四种:
- NONE:不记录任何日志信息,这是默认值。
- BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
- HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
- FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
修改feign的日志级别实现步骤:
方法一:配置文件
feign:
client:
config:
userservice: # 针对某个微服务的配置
# default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL # 日志级别
方法二: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)
Feign使用优化:
原理:
Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:
•URLConnection:默认实现,不支持连接池
•Apache HttpClient :支持连接池
•OKHttp:支持连接池
因此提高Feign的性能主要手段就是使用连接池代替默认的URLConnection
Ⅰ:在服务消费者的pom文件中引入Apache的HttpClient依赖
Ⅱ:在服务消费者的application.yml中配置连接池
feign:
httpclient:
enabled: true # 开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
代码优化:(简化重复的代码编写)
①继承
②抽取为一个独立模块,对外提供其依赖包
【扫描时可以扫描包或者需要加载接口的字节码**
@EnableFeignClients(basePackages = “cn.itcast.feign.clients”)
@EnableFeignClients(clients = {UserClient.class})】
Gateway服务网关:
作用: 为微服务架构提供一种简单有效的统一的 API 路由管理
核心功能:对用户请求做身份认证、权限校验
将用户请求路由到微服务,并实现负载均衡
对用户请求做限流
实现步骤:
Ⅰ:创建gateway服务,引入依赖
Ⅱ:编写启动类
Ⅲ:编写基础配置和路由规则(application.yml)
server:
port: 10010 # 网关端口
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: # 网关路由配置
- id: user-service # 路由id,自定义,只要唯一即可
# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/user/ # 这个是按照路径匹配,只要以/user/开头就符合要求
流程图:
断言工厂:**
