前言
本文主要记录nacos服务端搭建以及如何使用Nacos作为服务注册中心实现服务的注册与服务发现。
一、 Nacos简介
1.1 简介
文档: https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施
Nacos可以作为微服务架构中的注册中心(spring cloud的其他方案:eurekba、consul、zookeeper)以及配置中心(spring cloud config)来使用。
1.2 主要功能:
-
动态配置服务: 动态配置服务让您能够以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单,也让按需弹性扩展服务更容易。
-
服务发现及管理: 动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服务发现。Nacos也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助Nacos,您可以更容易地为您的服务实现断路器。
-
动态DNS服务: 通过支持权重路由,动态DNS服务能让您轻松实现中间层负载均衡、更灵活的路由策略、流量控制以及简单数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以消除耦合到厂商私有服务发现API上的风险。
二、Nacos服务端搭建
2.1 下载Nacos服务端
下载地址:https://github.com/alibaba/nacos/releases
上面的下载地址可以直接打开,滑动页面,选择合适版本进行下载。本次我选择了:2.0.0-ALPHA.2 ,如下图所示:
2.2 启动单机版Nacos
下载完成之后,解压。根据不同平台,执行不同命令,启动单机版Nacos服务:
- Linux/Unix/Mac:sh startup.sh -m standalone
- Windows:cmd startup.cmd -m standalone
启动过程如下图所示:
启动完成之后,访问:http://127.0.0.1:8848/nacos/,可以进入Nacos的服务登录页面,使用用户名密码nacos nacos 登录,进图到管理页面,具体如下;
’登录完成,进入nacos管理平台,界面如下图所示:
三、Nacos客户端
需要一定的SpringBoot基础,不熟悉的可以参考:https://blog.csdn.net/u014553029/category_7788769.html
服务提供者(库存服务) <-- 服务消费者(订单服务,下单时候调用库存服务扣库存)
3.1 服务提供者
3.1.1 创建一个Spring Boot应用,命名为:stock-service
3.1.2 编辑pom.xml,加入必要的依赖配置,如下:
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
<lombok.version>1.18.16</lombok.version>
</properties>
<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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 依赖声明 -->
<dependencyManagement>
<dependencies>
<!-- SpringCloud 微服务 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SpringCloud Alibaba 微服务-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.1.3 添加配置:
# 应用名称
spring:
application:
name: stock-service
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
cloud:
nacos:
discovery:
username: nacos
password: nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
server-addr: 127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
namespace: public
# 应用服务 WEB 访问端口
server:
port: 8101
servlet:
context-path: /
3.1.4 编写测试类:
/**
* @Description: 库存服务测试控制类
* @Author oyc
* @Date 2020/12/30 11:48 下午
*/
@RestController
@RequestMapping
@Slf4j
public class StockController {
@GetMapping
public String hello() {
log.info("invoked Hello,库存服务被调用了");
return "invoked Hello,库存服务被调用了";
}
@GetMapping("stock/allocation")
public String sale() {
log.info("商品销售,开始减库存");
return "减库存完成";
}
}
3.1.5 在启动类添加 @EnableDiscoveryClient 注解,开启Spring Cloud的服务注册与发现,如下图所示:
@SpringBootApplication
@EnableDiscoveryClient
public class StockServiceApplication {
public static void main(String[] args) {
SpringApplication.run(StockServiceApplication.class, args);
}
}
3.2 消费者
3.2.1 新增消费者springboot项目,命名为:order-service
3.2.2 添加pom依赖,与3.1.2中消费者依赖一致
3.2.3 配置
# 应用名称
spring:
application:
name: order-service
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
cloud:
nacos:
discovery:
username: nacos
password: nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
server-addr: 127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
namespace: public
# 应用服务 WEB 访问端口
server:
port: 8100
servlet:
context-path: /
3.2.4 添加RestTemplateConfiguration
@Configuration
public class RestTemplateConfiguration {
@Bean
@LoadBalanced//ribbon的负载均衡注解
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
3.2.5 添加测试类
@RestController
@RequestMapping
@Slf4j
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping
public String hello() {
log.info("invoked Hello,订单服务被调用了");
return "invoked Hello,订单服务被调用了";
}
@GetMapping("sale")
public String sale() {
log.info("订单服务, 开始下单售卖商品");
String stockServiceName = "stock-service";
String stackUrl = String.format("http://stock-service/stock/allocation", stockServiceName);
String forObject = restTemplate.getForObject(stackUrl, String.class);
System.out.println(String.format("订单服务,商品完成售卖:%s", forObject));
return "订单服务,商品完成售卖";
}
}
3.2.6 在启动类添加@EnableDiscoveryClient注解,开启Spring Cloud的服务注册与发现
@SpringBootApplication
@EnableDiscoveryClient
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
启动这两个项目
启动完成之后,可以在nacos管理平台中的服务管理–>服务列表中查看到已经注册的服务,如下图所示:
启动多个消费者,测试负载情况
以在启动时候增加-Dserver.port=8101的形式在本机的不同端口上启动多个实例。
tips: 客户端负载均衡
通过Spring Cloud Ribbon封装,在微服务架构中实现客户端负载均衡中,可实现负载均衡,ribbon(轮询),只需要两步:
-
服务提供者启动多个服务实例并注册到一个注册中心(或者是多个相关联的服务注册中心)。
-
服务消费者通过调用被@LoadBalanced注解过的RestTemplate来实现面向服务的接口调用。
当我们访问订单服务进行模拟下单时,订单服务会通过resttemplate远程调用库存 服务实行扣取库存操作。