Nacos服务分级存储模型
① 一级是服务,例如userservice
②二级是集群,例如杭州或上海
③ 三级是实例,例如杭州机房的某台部署了userservice的服务器
配置实例集群属性
改变服务的yml文件
spring:
cloud:
nacos:
discovery:
cluster-name: HZ
NacosRule负载均衡
在调用模块的yml中添加
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
根据权重负载均衡
环境隔离(namespace)
配置管理
配置更改热更新
统一配置管理:
步骤:
1.引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.在服务模块添加bootstrap.yml(优先级高于application. yml)
spring:
application:
name: userservice
profiles:
active: dev
cloud:
nacos:
server-addr: localhost:8848
config:
file-extension: yaml
执行步骤:项目启动-》读取nacos中配置文件(以bootstrap.yml为引导)-》读取本地配置文件application.yml-》创建spring容器-》加载bean
配置热更新
方法一:在@Value注入的变量所在类上添加注解@RefreshScope
@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
}
方法二:使用@ConfigurationProperties注解
package cn.itcast.user.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* PatternProperties
*
* @author huang
* @package cn.itcast.user.config
* @since 2024/3/1 19:36
*/
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dataformat;
}
之后要用自动装配把PatternProperties实例对象自动加载到要使用的地方
多环境配置共享
Data Id为服务名就是多环境配置共享
如果要分开发和发布环境,要加上-dev或-test之类的
配置优先级:服务名-profile.yaml >服务名称yaml>本地配置
配置临时实例
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
ephemeral: false
搭建Nacos集群
步骤:
- 搭建MySQL集群并初始化数据库表
- 下载解压nacos
- 修改集群配置(节点信息)、数据库配置
- 分别启动多个nacos节点
- nginx反向代理
Feign远程调用
Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign,其作用就是帮助我们优雅的实现http请求的发送
基于robbin实现负载均衡
步骤
1. 引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.1.0</version>
</dependency>
2. 在order-service的启动类添加注解开启Feign的功能:
@EnableFeignClients
@MapperScan("org.example.nacos.mapper")
@SpringBootApplication
public class NacosApplication {
public static void main(String[] args) {
SpringApplication.run(NacosApplication.class, args);
}
}
3. 编写clientsr包中feign客户端
@FeignClient("userservice")
public interface UserFeignClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
4. 直接用Fegin替代RestTemplate
自定义配置
可以通过配置文件application.yml
类型 | 作用 | 说明 |
feign.Logger.Level | 修改日志级别 | 包含四种不同的级别:NONE、BASIC、HEADERS、FULL |
feign.codec.Decoder | 响应结果的解析器 | http远程调用的结果做解析,例如解析json字符串为java对象 |
feign.codec.Encoder | 请求参数编码 | 将请求参数编码,便于通过http请求发送 |
feign.Contract | 支持的注解格式 | 默认是SpringMVC的注解 |
feign.Retryer | 失败重试机制 | 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试 |
性能优化
Feign底层的客户端实现:
URLConnection:默认实现,不支持连接池
Apache HttpClient:支持连接池
OKHttp:支持连接池
方法一 使用连接池
application.yml
feign:
client:
config:
default:
logger-level: BASIC
httpclient:
enabled: true
max-connections: 200
max-connections-per-route: 50
方法二 日志级别降低
Gateway网关
网关功能:
身份认证和权限校验
服务路由、负载均衡
请求限流
SpringCloudGateway
而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。
zuul
Zuul是基于Servlet的实现,属于阻塞式编程。
搭建网关服务的步骤:
1. 创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖
2. 编写路由配置及nacos地址
路由配置包括:
1.路由id:路由的唯一标示
2.路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
3.路由断言(predicates):判断路由的规则,
4.路由过滤器(filters):对请求或响应做处理
server:
port: 10010 # 网关端口
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos
gateway:
routes:
- id: user-service
uri: lb://userservice # 负载均衡
predicates:
- Path=/user/**
路由断言工厂
看开发者文档
过滤器工厂
看开发者文档