前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service
Nacos 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序。
Nacos:Dynamic Naming and Configuration Service
Nacos 就是注册中心+配置中心 等价于 Nacos = Eureka + Cofig + Bus
替代Eureka做服务注册中心
替代Config做服务配置中心
官网:https://nacos.io/zh-cn/
Github地址:https://github.com/alibaba/nacos
Spring Alibaba官方参考文档地址:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
(学习一项新技术,要养成阅读官网文档的习惯)
先从官网下载安装包
解压安装包你会看到如下目录结构,直接运行bin目录下的startup.cmd
看到上图图标及提示就证明你启动成功了,怎么确认呢?浏览器访问网址http://localhost:8848/nacos 看到下图
输入默认的账户名密码登录(默认帐户名称/密码为 nacos/nacos,进入主页面看到如下图示就安装就完工了
建立一个Maven工程在父POM下引入
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.1.0.RELEASE
pom
import
建立一个名为 Cloudalibaba-provider-payment 9001 模块 引入Pom:
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
#配置端口
server:
port: 9001
##配置服务信息
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
#暴露需要监控的所有接口
management:
endpoints:
web:
exposure:
include: "*"
Controller:
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos register, serverport=" + serverPort + "\t id:" + id;
}
}
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderDemoApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderDemoApplication.class, args);
}
@RestController
public class EchoController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}
现在启动你的项目,你就可以在Nacos控制台上看到已注册的服务。
Nacos的依赖项默认已经集成了Ribbon,1.自带@LoadBalance的能力 ; 2.可以直接调用RestTemplate
根据上文新建的模块9001微服务再创建一个9002的微服务
新建Cloudalibaba-consumer-nacos-order83模拟订单模块
引入依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-test
test
配置Application.yaml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
Controller:
@RestController
@Slf4j
public class OrderNacosController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverUrl;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id){
return restTemplate.getForObject(serverUrl + "/payment/nacos/" + id, String.class);
}
}
启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class, args);
}
}
启动Nacos服务,启动服务提供者9001和9002,以及83服务消费者
查看 http://localhost:8848/nacos,注册成功
访问:localhost:http://localhost:83/consumer/payment/nacos/13 ,轮询负载OK!
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring Cloud 和 Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须的,K8S服务和DNS服务则适用于CP模式。CP模式下支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
curl -X PUT `$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只要支持MySQL的存储。
Nacos默认自带的是嵌入式数据库derby
Nacos Pom中我们可以找到依赖 https://github.com/alibaba/nacos/blob/develop/config/pom.xml
第一步:本机安装了Mysql,再安装个可视化Navicat;
第二步:初始化MySQL数据库,数据库初始化文件:nacos-mysql.sql
,该文件可以在Nacos程序包下的conf
目录下获得。执行完成后可以得到如下图所示的表结构:
接着还是在Nacos下的conf目录中我们还会看到一个application.properties
我们按照官网的部署配置添加到最底部改为我们自己的数据库名称和密码
因为我本机已经安装了8.0,重装就太麻烦了,根据网上的这个方法修改之后就可以启动成功了 ,具体请前往:https://www.cnblogs.com/gyli20170901/p/11245270.html
再次启动修改后的nacos,进入nacos目录下config文件中在application最下方添加如下配置(修改为自己的数据库及用户名密码)
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?serverTimezone=GMT%2B8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
接着我们在nacos配置列表中新建配置信息就会发现mysql中也同步了。
基础配置
建立模块 cloudalibaba-config-nacos-client3377
引入POM
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
配置Yaml
这里有两个yaml 分别是application.yamlbootstrp.yaml
为什么配置两个yaml?
Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,
拉取配置之后,才能保证项目的正常启动。[先有共性再有个性]
springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
applicatio.yaml
spring:
profiles:
active: dev # 开发环境
# active: test # 测试环境
# active: info # 开发环境
bootstrap.yaml
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 # 这里指定的文件格式需要和nacos上新建的配置文件后缀相同,否则读不到
group: TEST_GROUP
namespace: 4ccc4c4c-51ec-4bd1-8280-9e70942c0d0c
#${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
Controller
@RestController
@RefreshScope // 支持nacos的动态刷新
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return configInfo;
}
}
官方文档地址:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
启动模块3377
访问 http://localhost:3377/config/info
修改Nacos配置中心中的yaml为version=2,再次调用查看配置的接口,动态刷新OK!