什么是 Nacos?( https://nacos.io/ )
Nacos 致力于帮助您发现, 配置和管理微服务. Nacos 提供了一组简单易用的特性集, 帮助您快速实现动态服务发现, 服务配置, 服务元数据及流量管理.
Nacos 帮助您更敏捷和容易地构建, 交付和管理微服务平台. Nacos 是构建以 "服务" 为中心的现代应用架构 (例如微服务范式, 云原生范式) 的服务基础设施.
服务 (Service) 是 Nacos 世界的一等公民. Nacos 支持几乎所有主流类型的 "服务" 的发现, 配置和管理:
- Kubernetes Service
- gRPC & Dubbo RPC Service https://dubbo.incubator.apache.org/
- Spring Cloud RESTful Service https://spring.io/understanding/REST
Nacos 的关键特性包括:
服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现. 服务提供者使用 原生 SDK https://nacos.io/zh-cn/docs/sdk.html ,OpenAPI https://nacos.io/zh-cn/docs/open-API.html , 或一个独立的 Agent TODO https://nacos.io/zh-cn/docs/other-language.html 注册 Service 后, 服务消费者可以使用 DNS TODO https://nacos.io/zh-cn/docs/xx 或 HTTP&API https://nacos.io/zh-cn/docs/open-API.html 查找和发现服务.
Nacos 提供对服务的实时的健康检查, 阻止向不健康的主机或服务实例发送请求. Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP,MySQL, 用户自定义)的健康检查. 对于复杂的云环境和网络拓扑环境中 (如 VPC, 边缘网络等) 服务的健康检查, Nacos 提供了 agent 上报模式和服务端主动检测 2 种健康检查模式. Nacos 还提供了统一的健康检查仪表盘, 帮助您根据健康状态管理服务的可用性及流量.
动态配置服务
动态配置服务可以让您以中心化, 外部化和动态化的方式管理所有环境的应用配置和服务配置.
动态配置消除了配置变更时重新部署应用和服务的需要, 让配置管理变得更加高效和敏捷.
配置中心化管理让实现无状态服务变得更简单, 让服务按需弹性扩展变得更容易.
Nacos 提供了一个简洁易用的 UI (控制台样例 Demo http://console.nacos.io/nacos/index.html ) 帮助您管理所有的服务和应用的配置. Nacos 还提供包括配置版本跟踪, 金丝雀发布, 一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性, 帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险.
动态 DNS 服务
动态 DNS 服务支持权重路由, 让您更容易地实现中间层负载均衡, 更灵活的路由策略, 流量控制以及数据中心内网的简单 DNS 解析服务. 动态 DNS 服务还能让您更容易地实现以 DNS 协议为基础的服务发现, 以帮助您消除耦合到厂商私有服务发现 API 上的风险.
Nacos 提供了一些简单的 DNS APIs TODO https://nacos.io/zh-cn/docs/xx 帮助您管理服务的关联域名和可用的 IP:PORT 列表.
服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据, 包括管理服务的描述, 生命周期, 服务的静态依赖分析, 服务的健康状态, 服务的流量管理, 路由及安全策略, 服务的 SLA 以及最首要的 metrics 统计数据.
Nacos 全景图
阿里巴巴中间件团队出品的 Nacos 来作为新一代的服务管理中间件.
Nacos Spring Cloud 快速开始
安装 nacos
下载地址: https://github.com/alibaba/nacos/releases
下载完成之后, 解压. 根据不同平台, 执行不同命令, 启动单机版 Nacos 服务:
- Linux/Unix/Mac:
- sh startup.sh -m standalone
- Windows:
- cmd startup.cmd -m standalone
startup.sh 脚本位于 Nacos 解压后的 bin 目录下.
启动之后 nacos 默认端口为 8848
补充一点, nacos 不仅可以做注册中心, 还可以做分布式配置, 相对 SpringCloud 在 Git 做配置较好点
构建应用接入 Nacos 注册中心
在完成了 Nacos 服务的安装和启动之后, 下面我们就可以编写两个应用 (服务提供者与服务消费者) 来验证服务的注册与发现了.
服务提供者
1, 创建第一个 Springboot 项目 spring-cloud-nacos-provider 作为服务提供者
2, 引入 gradle
- compile 'org.springframework.boot:spring-boot-starter-actuator'
- compile 'org.springframework.boot:spring-boot-starter-web'
- compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery', version: '0.1.1.RELEASE'
注意: 这里之前确实采坑, 因为 nacos 是新生态所以无法自动和 cloud 或 boot 版本一致, 所以必须写入版本号, 版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本, 版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本.
3, 创建主要类
启动入口
- package org.gw;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
- import org.springframework.cloud.client.loadbalancer.LoadBalanced;
- import org.springframework.context.annotation.Bean;
- import org.springframework.Web.client.RestTemplate;
- /**
- * @DATA 2019-03-18 15:21
- * @Author 张国伟 WeChat:17630376104
- * @Description TODO
- */
- @EnableDiscoveryClient
- @SpringBootApplication
- public class NoApplication {
- public static void main(String[] args) {
- SpringApplication.run(NoApplication.class,args);
- }
- }
- @RestController
- public class NacosProducerController {
- @RequestMapping("/hello")
- public String hello(@RequestParam("name")String name)
- {
- return "hello::"+name;
- }
- }
内容非常简单,@SpringBootApplication 定义是个 Spring Boot 应用;@EnableDiscoveryClient 开启 Spring Cloud 的服务注册与发现, 由于这里引入了 spring-cloud-starter-alibaba-nacos-discovery 模块, 所以 Spring Cloud Common 中定义的那些与服务治理相关的接口将使用 Nacos 的实现. 这点不论我们使用 Eureka,Consul 还是其他 Spring Cloud 整合的注册中心都一样, 这也是 Spring Cloud 做了封装的好处所在
4, 配置文件
- server:
- port: 5005
- spring:
- application:
- name: spring-cloud-nacos-provider
- cloud:
- nacos:
- discovery:
- server-addr: 127.0.0.1:8848
- management:
- endpoints:
- Web:
- exposure:
- include: '*'
5, 启动应用程序, 启动后可以看到控制台日志出现以下内容说明已经成功注册到 nacos 中.
- Wed Mar 20 08:59:13 CST 2019 sun.misc.Launcher$AppClassLoader@18b4aac2 JM.Log:INFO Log root path: /Users/Mac/logs/
- Wed Mar 20 08:59:13 CST 2019 sun.misc.Launcher$AppClassLoader@18b4aac2 JM.Log:INFO Set nacos log path: /Users/Mac/logs/nacos
- 2019-03-20 08:59:13.438 INFO 1645 --- [ main] o.s.c.a.n.registry.NacosServiceRegistry : nacos registry, spring-cloud-nacos-provider 172.20.10.3:5005 register finished
在启动都 ok 之后, 我们可以访问 Nacos 的管理页面 http://127.0.0.1:8848/nacos/ 来查看服务列表, 此时可以看到如下内容:
这里会显示当前注册的所有服务, 以及每个服务的集群数目, 实例数, 健康实例数. 点击详情, 我们还能看到每个服务具体的实例信息, 如下图所示:
服务消费者
接下来, 实现一个应用来消费上面已经注册到 Nacos 的服务.
1, 创建一个 Spring Boot 应用, 命名为: spring-cloud-nacos-consumer.
2, 编辑 pom.xml 中的依赖内容, 与上面服务提供者的一样即可.
3, 创建应用主类, 并实现一个 HTTP 接口, 在该接口中调用服务提供方的接口.
- package org.gw;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.boot.Web.client.RestTemplateBuilder;
- import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
- import org.springframework.cloud.client.loadbalancer.LoadBalanced;
- import org.springframework.context.annotation.Bean;
- import org.springframework.Web.client.RestTemplate;
- /**
- * @DATA 2019-03-18 15:45
- * @Author 张国伟 WeChat:17630376104
- * @Description TODO
- */
- @EnableDiscoveryClient
- @SpringBootApplication
- public class ConApplication
- {
- @LoadBalanced
- @Bean
- public RestTemplate resultTemplate()
- {
- RestTemplate template = new RestTemplate();
- return template;
- }
- public static void main(String[] args)
- {
- SpringApplication.run(ConApplication.class, args);
- }
- }
- package org.gw.controller;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.cloud.client.ServiceInstance;
- import org.springframework.cloud.client.discovery.DiscoveryClient;
- import org.springframework.Web.bind.annotation.RequestMapping;
- import org.springframework.Web.bind.annotation.RequestParam;
- import org.springframework.Web.bind.annotation.RestController;
- import org.springframework.Web.client.RestTemplate;
- /**
- * @DATA 2019-03-18 16:06
- * @Author 张国伟 WeChat:17630376104
- * @Description TODO
- */
- @RestController
- public class ConController {
- @Autowired
- RestTemplate restTemplate;
- /**
- * 消费服务
- */
- @RequestMapping("/callSayHello")
- public String services(@RequestParam("name") String name) {
- String callServiceResult = restTemplate.getForEntity("http://spring-cloud-nacos-provider/hello?name="+name,String.class).getBody();
- System.out.println(callServiceResult);
- return callServiceResult;
- }
- }
4, 配置服务名称和 Nacos 地址, 让服务消费者可以发现上面已经注册到 Nacos 的服务.
- server:
- port: 5006
- spring:
- application:
- name: spring-cloud-nacos-consumer
- cloud:
- nacos:
- discovery:
- server-addr: 127.0.0.1:8848
- management:
- endpoints:
- Web:
- exposure:
- include: '*'
第五步: 启动服务消费者, 我们在浏览器测试:
到此 nacos 单机版的服务与发现就完全实现.
本文章示例: https://github.com/zgw1469039806/SpringCloud-nacos
来源: https://www.cnblogs.com/zgwjava/p/10562775.html