Nacos注册中心(1)
什么是Nacos
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式)的服务基础设施。
使用Nacos组件可以作为微服务架构的注册中心和配置中心,可以简单理解为可以代替Netflix解决方案中的Eureka组件和Spring Cloud Config组件。
Nacos官方地址:https://nacos.io/zh-cn/index.html
主要功能
- 动态配置服务
动态配置服务让您能够以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单,也让按需弹性扩展服务更容易。
- 服务发现及管理
动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服务发现。Nacos也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助Nacos,您可以更容易地为您的服务实现断路器。
- 动态DNS服务
通过支持权重路由,动态DNS服务能让您轻松实现中间层负载均衡、更灵活的路由策略、流量控制以及简单数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以消除耦合到厂商私有服务发现API上的风险。
安装单机版Nacos
Nacos下载地址:https://github.com/alibaba/nacos/releases
截止目前最新版本为:2.0.0
下载之后解压进入到bin目录执行启动命令:cmd startup.cmd -m standalone
命令参数中-m表示模式mode,standalone表示启动的是单机版模式,linux用户可以使用该命令启动Nacos: sh startup.sh -m standalone,执行启动命令之后可以查看到启动日志:tail -fn 200 /home/server/nacos/logs/start.out
Nacos是一个用Java语言编写的web项目,Tomcat默认端口是8848,访问8848端口可以打开Nacos管理台。
默认用户名和密码都是nacos
Nacos管理台菜单包含了四大部分:
- 配置管理(管理配置中心)
- 服务管理(管理注册中心)
- 权限管理
- 命名空间
- 集群管理
使用Nacos注册中心功能
生产者服务
第一步:创建一个nacos-test项目,包含两个模块nacos-provider和nacos-consumer,在父项目pom.xml文件统一管理springboot、spring cloud和spring cloud alibaba版本。
acos-test的依赖配置pom.xml
<!-- 依赖声明 --> <dependencyManagement> <dependencies> <!-- SpringBoot 依赖配置 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.7.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!-- SpringCloud 微服务 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR9</version> <type>pom</type> <scope>import</scope> </dependency> <!-- SpringCloud Alibaba 微服务 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
第二步:先来处理nacos-provider模块项目,在nacos-provider模块项目的pom.xml配置alibaba-nacos-discovery依赖。
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.0</version> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--nacos注册中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>
第三步:编写入口类NacosProvider
package org.nacos.provider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class NacosProvider { public static void main(String[] args) { SpringApplication.run(NacosProvider.class,args); } }
第四步:添加一个EchoController 提供HTTP接口服务。
package org.nacos.provider.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class EchoController { @GetMapping("/providerecho/{string}") public String echo(@PathVariable String string) { return "Hello Nacos Discovery " + string; } }
第五步:在bootstrap.yml文件配置nacos配置中心相关参数。
spring: application: name: nacos-provider cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #注册中心地址 server: port: 9090
第六步:运行nacos-provider,可以从启动日志看到注册到了nacos,打开nacos管理台在服务管理菜单下的服务列表项可以看到注册的实例信息。
消费者服务
第一步:接下来处理nacos-consumer模块项目,在nacos-consumer模块项目的pom.xml配置同样加上alibaba-nacos-discovery依赖。
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.0</version> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--注册中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>
第二步:编写入口类NacosConsumer ,并注入RestTemplate
springboot是无法自动注入RestTemplate 的,但是springcloud就可以自动注入,因此将其独立出来之后不能够简单照旧;需要我们在springboot配置类中注入RestTemplate,也就是在启动类加上RestTemplate的Bean
加一个@LoadBalanced注解,就能让这个RestTemplate在请求时拥有客户端负载均衡的能力
package org.nacos.consumer; 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; @SpringBootApplication @EnableDiscoveryClient public class NacosConsumer { //springboot是无法自动注入RestTemplate 的,但是springcloud就可以自动注入,因此将其独立出来之后不能够简单照旧;需要我们在springboot配置类中注入RestTemplate,也就是在启动类加上RestTemplate的Bean @Autowired private RestTemplateBuilder builder; // 使用RestTemplateBuilder来实例化RestTemplate对象,spring默认已经注入了RestTemplateBuilder实例 //加一个@LoadBalanced注解,就能让这个RestTemplate在请求时拥有客户端负载均衡的能力 @Bean @LoadBalanced public RestTemplate restTemplate() { return builder.build(); } public static void main(String[] args) { SpringApplication.run(NacosConsumer.class,args); } }
第三步:添加一个TestController提供HTTP接口服务,通过RestTemplate远程调用NacosProvider。
package org.nacos.consumer.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class TestController { @Autowired private RestTemplate restTemplate; @GetMapping("/consumerecho/{str}") public String echo(@PathVariable String str) { return restTemplate.getForObject("http://nacos-provider/providerecho/" + str, String.class); } }
第四步:在bootstrap.yml文件配置nacos配置中心相关参数。
spring: application: name: nacos-consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #注册中心地址 server: port: 9091
第五步:测试消费者调用提供者接口服务。