三种方案加载配置:
1. DataID方案
指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置
默认空间+默认分组+新建dev和test两个DataID
从而实现配置dev就加载dev,配置test就加载test
2. Group方案
新建两个配置文件,DataID为: nacos-config-client-info.yaml
通过切换 config.group 为DEV_GROUP或TEST_GROUP,即可实现配置的切换。
3. Namespace方案
test命名空间一样,添加两个文件。
bootstrap.yml
# nacos配置 server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 config: server-addr: localhost:8848 #Nacos作为配置中心地址 file-extension: yaml #指定yaml格式的配置 group: DEV_GROUP namespace: eaf79b3e-daa1-4a19-b5f1-7c4839e9b4a9 # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} # nacos-config-client-dev.yaml
加入了一行,namespace: 命名空间Id,测试,修改不同的命名空间Id,就可获取到不同的文件内容。
就好比有一个大型项目,需要部署在上海和杭州,命名空间就叫 HZ(杭州),SH(上海),项目下又有多个微服务,通过Group来命名属于项目中的哪个微服务,每个服务又有开发环境、测试环境、生产环境,最后再通过 application.yml中的spring.profiles.active区分更具体的环境。
获取配置文件的顺序:命名空间(默认public)》Group》Data Id
5. Nacos集群和持久化配置
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。
总不可能集群的每个节点我们都一个个去改吧?
为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
Nacos默认自带的是嵌入式数据库derby 查看
1. derby到mysql切换配置步骤
nacos-server-1.1.4\nacos\conf目录下找到sql脚本
nacos-mysql.sql,数据库执行,注意里边是否有创建数据库,没有的话先执行Create DataBase
CREATE DATABASE nacos_config; USE nacos_config;
nacos-server-1.1.4\nacos\conf目录下找到application.properties
最下边加入
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=123456
ok,重启Nacos,可以看到之前加入的命名空间、服务,都没有了,看到的是个全新的空记录界面,以前是记录进derby。
6. Linux版Nacos+MySQL生产环境配置
需要:1个Nginx+3个nacos注册中心+1个mysql
下载nacos:https://github.com/alibaba/nacos/releases
上传至 opt/,解压移动到mynacos下
cp -r nacos /mynacos/
1.Linux服务器上mysql数据库配置
根据 nacos/conf/nacos-mysql.sql文件,导表
mynacos/nacos/conf:cp application.properties.example application.properties vim application.properties
application.properties文件最后加入:
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=123456
2.Linux服务器上nacos的集群配置cluster.conf
复制出:cluster.conf
cluster.conf.example cluster.conf
内容:
这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP
3.编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端口
/mynacos/nacos/bin 目录下有startup.sh
最下边是: -Dserver.port=${PORT}
依次启动3333,4444,5555
4. Nginx的配置,由它作为负载均衡器
修改 nginx/conf/nginx.conf
upstream cluster{ server 127.0.0.1:3333; server 127.0.0.1:4444; server 127.0.0.1:5555; } server { listen 1111; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { #root html; #index index.html index.htm; proxy_pass http://cluster; }
./nginx -c /usr/local/nginx/conf/nginx.conf
访问:http://192.168.111.144:1111/nacos/#/login,新建一个配置,然后查看config_info表,里边有数据就ok.
7. SpringCloud Alibaba Sentinel实现熔断与限流
官网:https://github.com/alibaba/Sentinel
下载:https://github.com/alibaba/Sentinel/releases
解决服务使用中的各种问题:服务雪崩、服务降级、服务熔断、服务限流 …
1. 安装Sentinel控制台
下载:
运行:
环境:java8环境,8080端口不能被占用
java -jar sentinel-dashboard-1.7.0.jar
访问:http://localhost:8080,登录账号密码均为 sentinel
2. 初始化演示工程
新建Module, cloudalibaba-sentinel-service8401
pom
<dependencies> <!--SpringCloud ailibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到--> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency> <!--SpringCloud ailibaba sentinel --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!--openfeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- SpringBoot整合Web组件+actuator --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--日常通用jar包配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.6.3</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
yml
server: port: 8401 spring: application: name: cloudalibaba-sentinel-service cloud: nacos: discovery: #Nacos服务注册中心地址 server-addr: localhost:8848 sentinel: transport: #配置Sentinel dashboard地址 dashboard: localhost:8080 #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口 port: 8719 management: endpoints: web: exposure: include: '*'
主启动
@EnableDiscoveryClient @SpringBootApplication public class MainApp8401 { public static void main(String[] args) { SpringApplication.run(MainApp8401.class, args); } }
业务类
@RestController public class FlowLimitController { @GetMapping("/testA") public String testA() { return "------testA"; } @GetMapping("/testB") public String testB() { return "------testB"; } }
启动,查看Sentinel控制台,什么也没有,Sentinel采用的懒加载,需要先执行一次访问即可
http://localhost:8401/testA
可以看到sentinel8080正在监控微服务8401
3. 流控规则
4. 流控模式
直接(默认)
1.QBS(每秒的请求数量)
表示1秒钟内查询1次就是OK,若超过次数1,就直接-快速失败,报默认错误
访问:http://localhost:8401//testB,
线程数
请求:http://localhost:8401/testB,一直刷,都没问题,这是因为方法执行时间太快,毫秒级别就响应了。
修改testB方法,记得IDEA启用热部署,否则重启后,限流规则会重置(目前还没有做持久化配置)
@GetMapping("/testB") public String testB() { try { TimeUnit.MILLISECONDS.sleep(800); } catch (InterruptedException e) { e.printStackTrace(); } return "------testB"; }
访问:http://localhost:8401/testB,快速请求两次(F5两次),当线程数达到阈值时,直接限流。
2. 关联
当关联资源/testA的qps阀值超过1时,就限流/testB的Rest访问地址,当关联资源到阈值后限制配置好的资源名
postman模拟并发密集访问 关联资源 testA