文章目录
- 技术选型过程
- 一、问题出现
- 二、需求
- 分布式注册中心cap模型
- 三、开始着手解决
- nacos安装
- 一、spring boot配置
- 1.IDEA新建工程
- 2.修改porpertise
- 二、nacos服务安装使用
- 1.安装
- 2.启动
- 3.地址
- 三、逻辑代码
- 启动类
- 测试controller
- nacos配置添加
- 四、测试
- 五、注意事项
技术选型过程
一、问题出现
eurka+config做注册中心和配置中心
spring-cloud-config是因为简单容易集成,但原生不支持配置的实时推送,可以做到,但更新推送依赖git和spring cloud bus,链路较长,比较复杂。
优点是eurka自带的管理界面比较简单,但可以支持定制
而且因为我目前在移动上班这个项目太大了想减少运维工作(我之前在物联网公司上班,方向不同所以遇到问题不同)
二、需求
我们需要一个可以实时动态更新配置用于替换spring-cloud-config,也想换掉停止更新的注册Eureka。
简单来说我不想在项目里用Eureka+config这个组合了,我想要一个更好的分布式中心注册服务和配置管理工具。
分布式注册中心cap模型
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾
- C
一致性,意思为如果集群中服务宕机需要立即发出指令其他设备保持数据同步,这样会影响性能因为在同步过程中消耗时间对外提供服务的性能会降低。 - A
可用性,集群中只要有一个节点存活就对外提供服务,但因为数据保持一致需要时间那么在发生宕机时保持对外提供服务就会导致数据不对的情况。 - P
通信的时限要求,相当于发生宕机数据同步超时的时候必须从C或者A中选择一个方案,要么选择A严阵以待,要么选择C攘外必先安内。
三、开始着手解决
后来发现携程Apollo 阿里nacos有能解决我问题的开源框架
- nacos
因为nacos 使用的组件少 一个nacos服务和mysql,nacos服务提供界面和service,运维成本低,用起来也简单界面也好,性能三个里边最高,超多的中文文档,对我这种阅读英文全靠有道的很友好,人家双十一表现都那么优秀。
nacos = 注册中心 + 配置中心
那么nacos完全适合我当前的需求。 - springcloud+apollo
携程Apollo部署组件较多,apollo-configservice修改推送是一个服务,apollo-portal界面是一个服务,apollo-adminservice中心注册是一个服务,运维成本比Nacos高,大数据量并发效率比nacos低一点,其他的功能和nacos差不多,其中也使用到了eurka做中心注册 - dubbo + zookeeper
性能是问题一旦并发量大了,写性能很难扩展增加,靠TCP的心跳判断服务是否可用,但TCP的活性并不代表服务是可用的如果线程池满了,数据库挂了,他比较注重CP强一致性,要做到强一致性就需要在性能上做出让步
当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30~120s,而且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。
参考搭建博客一参考搭建博客二
nacos安装
什么是nacos
Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心)、动态配置服务(可以做配置中心)、动态 DNS 服务。它可以是CP也可以是AP。
官方介绍是这样的
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。
官方网址 nacos官网
我的介绍是这样的
这个玩意能动态更新配置文件,我和我的小伙伴都惊呆了,以后换配置方便的不行啊!还可以配置共用免得每次对同类型的项目一个一个改的难受。
一、spring boot配置
1.IDEA新建工程
!!!!!!!!!!!!!!!!!!
在这里要注意,我选择的依赖包!如果没有选中则需要自己选择对应的版本放入pom文件中。
!!!!!!!!!!!!!!!!!!
在这里我使用了easycode生成了一个sql查询过程,注意对比一下我的工程目录结构
2.修改porpertise
注意: application.porpertise更改名字为bootstrap.yml
因为nacos不识别application,bootstrap.yml级别比application.porpertise要高,先识别然后会被转换为porpertise,没有其他的差别
# Tomcat
server:
port: 9888
# Spring
spring:
application:
# 应用名称
name: demo
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: localhost:8848
config:
# 配置中心地址
server-addr: localhost:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-dataids: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
datasource:
url: jdbc:mysql://localhost:3306/read_data?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: admin
password: admin
driver-class-name: com.mysql.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
二、nacos服务安装使用
1.安装
- 下载 nacos-servver-1.3.2.zip / nacos-server-1.3.2.tar.gz
- 下载地址:https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3.2.zip
- 解压下载的安装包到本地目录
- 执行config下的nacos-mysql.sql文件
- 修改 /config/application.properties 文件的如下内容:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456
2.启动
- 以单机模式启动 NACOS
切换到bin目录下有四个启动脚本根据系统去使用那个脚本
脚本参数为 -m standalone
例如:startup.sh -m standalone
3.地址
http://localhost:8848/nacos
默认登录用户名密码:nacos/nacos
三、逻辑代码
启动类
@SpringBootApplication
@MapperScan("com.example.demo.dao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
测试controller
@RestController
@RequestMapping("/item")
@RefreshScope
public class ItemController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@GetMapping("/get")
public boolean get() {
return useLocalCache;
}
}
nacos配置添加
在这里我就不再添加了,直接看我创建好的配置吧
四、测试
访问
http://localhost:9888/item/get 会显示配置文件中的useLocalCache值
也可以使用官方提供的测试
https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-cloud-example/nacos-spring-cloud-config-example/src/main/java/com/alibaba/nacos/example/spring/cloud/controller/ConfigController.java
五、注意事项
- mybatis 需要在启动类加注解扫描dao接口@MapperScan(“com.example.demo.dao”)
- @RefreshScope 表示该类引用的配置实时更新和@Value注解搭配使用