Nacos安装及注册发现服务
前一篇文章主要介绍我们基于SpringCloudAlibaba自研的TechEd服务平台概览,计划采用一些文章来说明学习和建设的过程。在TechEd服务平台与之前建设的服务最大的区别是从Eureka转到阿里的Nacos服务中。原因既有奈飞各种组件慢慢闭源的因素,Nacos在国内用户越来越多,特别是2.0版本发行后,无论稳定性还是性能都有极大的提升;但更多的还是内部因素,从2016年12月份开始使用奈飞SpringCloud组件,再次转到Nacos,过程虽然艰辛,但在学习开发中,仍然是令人愉悦的。
接下来这个主题主要是分享Nacos学习过程,在主题的最后,会将目前TechEd使用Nacos的方案作为实际案例与大家分享和学习。
什么是Nacos
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。(Nacos Docs:https://nacos.io/zh-cn/docs/what-is-nacos.html)
在以前的服务架构中主要使用了Eureka作为注册中心,Spring Cloud Config作为配置中心,在TechEd服务架构中,采用了Nacos作为微服务的注册中心以及配置管理中心。
安装Nacos
下载地址:https://github.com/alibaba/nacos/releases
示例版本:1.3.2。20年末爆发了Naocs漏洞,1.3.2之前的版本无法启用身份认证,匿名可访问查询、修改、删除等API,因此建议采用1.3.2+版本。如果Nacos服务不考虑对外开放,问题也不大。
下载完成后解压,在nacos/bin中提供了不同平台的启动脚本
- Windows:cmd startup.cmd -m standalone
- Linux:./startup.sh -m standalone
默认情况下,没有启用数据持久化,参数-m standalone表明是以独立方式启动。
直接访问将自动登录,默认账号:nacos/nacos
启动完成之后,在浏览器中访问:http://localhost:8848,即可进入Nacos管理页面,此时服务部署完成。
应用接入Nacos
在这里采用两个简单的服务,一个作为服务提供者,一个作为消费者,来实现服务注册到Nacos的整个流程。
服务提供者
(一):先创建一个Maven项目,命名为:nacos-discovery,之后实现SpringBoot的配置,同时调整部分pom配置。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- parent,确定springboot版本,这里采用了2.2.6.RELEASE版本,与springcloud版本相对应
- spring-cloud-starter-alibaba-nacos-discovery,实现Nacos服务注册与发现,依赖于dependencyManagement中配置的版本号
- 确定springcloud版本为Hoxton.SR7,alibabacloud版本为2.2.3.RELEASE(该版本支持注册及配置中心用户名及密码认证模式)
(二):POM配置完成后,使用IDEA的导入功能,完成各个组件的导入工作,之后在resources中添加application.yml配置文件,实现如下配置
server:
port: 8700
spring:
application:
name: @project.artifactId@
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
这里仅配置了Nacos的服务地址为127.0.0.1:8848,将注册到默认的public命名空间下。
yml中通过@@包裹的字符串形式访问项目POM中的配置信息,如上面的name、description、version,按照路径的写法可以访问到POM中所有配置的信息。
properties文件通过${}形式访问POM中的配置信息。
默认创建项目后,直接配置启动此时显示的原始字符串,并没有读取到POM中的配置信息,需要在POM的build节点中添加以下信息
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
此时再次编译启动,将对yml文件的@@字符使用POM中的信息进行替换,在编译后或打包后的文件中查看application.yml文件,发现@project.name等信息已被替换为真实数据信息。
(三):创建启动类,并完成测试接口的开发
@SpringBootApplication
@EnableDiscoveryClient
public class NacosDiscoveryApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDiscoveryApplication.class, args);
}
@RestController
public class HelloClass {
@GetMapping("/hi")
public String hello(@RequestParam("name") String name) {
System.out.println("服务被调用");
return "hi " + name;
}
}
}
Application启动类的开发和Eureka相同,添加了SpringBootApplication、EnableDiscoveryClient,标识这是一个springboot应用,且实现了服务的注册发现。并实现了一个简单的测试接口。
(四):以上完成后,启动多个多个实例
java -jar nacos-discovery-1.0-SNAPSHOT.jar
java -jar nacos-discovery-1.0-SNAPSHOT.jar --server.port=8701
第一个默认使用application.yml中配置的8700端口,另外一个实例使用8701端口。此时查看Nacos控制台,发现服务的信息和数量和启动一致。
服务消费者
服务消费者的创建参考服务提供者,两者基本上一致。
(一):先创建一个Maven项目,命名为:nacos-client,之后的POM配置和服务提供者一致
(二):在resources中添加application.yml配置文件,实现如下配置
server:
port: 8800
spring:
application:
name: @project.artifactId@
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
除了端口外,其他和服务提供者一致。
(三):创建启动类,并完成测试接口的开发,在测试接口中完成服务提供接口的消费
@SpringBootApplication
@EnableDiscoveryClient
public class NacosClientApplication {
public static void main(String[] args) {
SpringApplication.run(NacosClientApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RestController
public class ClientClass {
@Autowired
RestTemplate restTemplate;
@GetMapping("/consumer")
public String consumer(@RequestParam("name") String name) {
return restTemplate.getForObject("http://nacos-discovery/hi?name=" + name, String.class);
}
}
}
调用服务时,采用了RestTemplate方案,并实现了负载均衡功能,用于测试上面启动的两个服务提供者实例。
(四):启动服务消费者,并测试接口
启动后,观察Nacos控制台,此时除了上面启动的两个服务提供者外,新增了服务消费者实例。
在浏览器中访问http://localhost:8800/consumer?name=world,并经过多次刷新,观察提供者控制台
通过服务提供者控制台的观察,在调用接口时,多个服务实例,被依次调用,实现了负载均衡。此处的表现和Eureka下完全一致。
相关示例资源
- nacos-discovery:https://github.com/linanyi/nacos-discovery
- nacos-client:https://github.com/linanyi/nacos-client
本文暂时没有评论,来添加一个吧(●'◡'●)