服务注册与发现, 服务发现主要用于实现各个微服务实例的自动化注册与发现, 是微服务治理的核心, 学习 Spring Cloud Alibaba, 首先要了解框架中的服务注册和发现组件 --Nacos.
一, Spring Cloud 服务注册和发现组件
1.Spring Cloud Eureka 闭源风波
在 Spring Cloud 的子项目中, Spring Cloud Netflix 提供了 Eureka 来实现服务的发现功能, Eureka 的服务发现包含两大组件: 服务端发现组件 (EurekaServer) 和客户端发现组件(Eureka Client).Eureka 的服务发现机制如图所示.
当客户端服务通过注解等方式嵌入到程序的代码中运行时, 客户端发现组件就会向注册中心注册自身提供的服务, 并周期性地发送心跳来更新服务, 如果连续三次心跳都不能够发现服务, 那么 Eureka 就会将这个服务节点从服务注册表中移除. 各个服务之间会通过注册中心的注册信息以 REST 方式来实现调用, 并且可以直接通过服务名进行调用.
2012 年, Netflix 将 Euerka 开源, Euerka 在 Spring Cloud 中广泛应用, 但是 2018 年 6 月, Netflix 宣布 Euerka 2.0 闭源, 目前社区中集成的都是 1.0 版本, 闭源之后, 服务发现选择哪个组件, 答案就是 Nacos.
2. 阿里巴巴开源 Nacos
阿里巴巴官方给 Nacos 的定位是「一个更易于构建云原生应用的动态服务发现, 配置管理和服务管理平台」.Nacos 支持的功能包括服务发现, 集成配置中心, 和服务数据管理.
二, Nacos 本地安装和启动
可以通过源码和发行包两种方式来获取 Nacos, 下面我们下载源码并且构建.
从 GitHub 上下载源码并编译
- Git clone https://github.com/alibaba/nacos.git
- cd nacos/
- mvn -Prelease-nacos clean install -U
- ls -al distribution/target/
- // change the $version to your actual path
- cd distribution/target/nacos-server-$version/nacos/bin
启动 Nacos 服务
Linux/Unix/Mac 系统
启动命令(standalone 代表着单机模式运行, 非集群模式):
sh startup.sh -m standalone
Windows 系统
启动命令:
- `
- cmd startup.cmd
- `
或者双击 startup.cmd 运行文件
应用启动之后, 访问 http://127.0.0.1:8848/nacos/,Nacos0.8 版本已经支持简单登录功能, 默认用户名 / 密码为: nacos/nacos.
三, 集成 Spring Cloud 服务发现
如果你还不是很熟悉 Spring Cloud 项目的创建, 可以先看一下前面这篇博文,.
最新的版本关系查看 版本说明 Wiki
创建服务提供者
1. 新建 Spring Boot 工程, 命名为 nacos-spring-cloud, 在中添加 Nocos 的依赖, 注意: 版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本, 版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本.
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- <version>0.2.2.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>com.alibaba.nacos</groupId>
- <artifactId>nacos-client</artifactId>
- <version>1.1.0</version>
- </dependency>
- </dependencies>
- </dependencyManagement>
2. 添加一个模块, nacos-spring-cloud-provider, 作为 服务提供者, Pom 文件配置如下
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- <exclusions>
- <exclusion>
- <groupId>com.alibaba.nacos</groupId>
- <artifactId>nacos-client</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.alibaba.nacos</groupId>
- <artifactId>nacos-client</artifactId>
- </dependency>
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-validator</artifactId>
- <version>5.1.0.Final</version>
- </dependency>
- </dependencies>
3. 创建启动类, 在启动类中添加一个 Restful 类型的方法, 作为服务实现.
- @SpringBootApplication
- @EnableDiscoveryClient
- @RestController
- public class NacosProviderApplication {
- public static void main(String[] args) {
- SpringApplication.run(NacosProviderApplication.class, args);
- }
- @RequestMapping(value = "/hello/{string}", method = RequestMethod.GET)
- public String echo(@PathVariable String string) {
- return "Hello" + string;
- }
- }
4. 修改配置文件, 注册到 Nacos 控制台.
- server.port=8070
- spring.application.name=service-provider
- spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
5. 启动工程, 查看 Nacos 控制台.
创建服务消费者
1. 添加一个新 module,nacos-spring-cloud-consumer, 作为服务消费者.
2. 在启动类中添加一个 Restful 类型的方法, Pom 文件依赖如下:
- <properties>
- <spring-cloud-openfeign.version>2.0.0.RELEASE</spring-cloud-openfeign.version>
- <spring-cloud-netflix.version>2.0.0.RELEASE</spring-cloud-netflix.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
- <version>${spring-cloud-netflix.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-openfeign</artifactId>
- <version>${spring-cloud-openfeign.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- <exclusions>
- <exclusion>
- <groupId>com.alibaba.nacos</groupId>
- <artifactId>nacos-client</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.alibaba.nacos</groupId>
- <artifactId>nacos-client</artifactId>
- </dependency>
- </dependencies>
3. 创建启动类和测试方法, 来调用提供者的服务.
- @SpringBootApplication
- @EnableDiscoveryClient
- public class NacosConsumerApplication {
- public static void main(String[] args) {
- SpringApplication.run(NacosConsumerApplication.class, args);
- }
- @LoadBalanced
- @Bean
- public RestTemplate restTemplate() {
- return new RestTemplate();
- }
- }
通过 RestTemplate 调用服务:
- @RestController
- public class TestController {
- @Autowired
- private RestTemplate restTemplate;
- @RequestMapping(value = "/hello/{str}", method = RequestMethod.GET)
- public String echo(@PathVariable String str) {
- return restTemplate.getForObject("http://service-provider/hello/" + str, String.class);
- }
- }
4. 修改配置文件, 订阅服务
- server.port=8080
- spring.application.name=service-consumer
- spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
5. 启动工程, 查看 Nacos 控制台.
6. 测试服务调用, 正常返回.
四, 总结
这个小教程用一个简单的示例, 搭建了基于 Nacos 的 Spring Cloud 服务发现, 可以看到 Nacos 的控制台还有配置管理的功能, 下一节会学习 Nacos 的配置管理.
来源: https://yq.aliyun.com/articles/740521