上一篇了解了 Nacos并安装了 nacos-server服务。接下来简单搭建一个微服务项目,使用 Nacos做注册中心。
一、项目搭建
Spring Cloud Alibaba环境版本选型说明:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
这里选择版本如下:
1、创建父模块
创建一个 maven项目(pom),在 pom.xml中管理版本。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>14</maven.compiler.source>
<maven.compiler.target>14</maven.compiler.target>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.8.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- spring-cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud-alibaba-dependencies -->
<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>
2、创建order服务
创建 app-order服务,服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos Server 上。
2.1 引入依赖
当前项目pom中引入服务发现 nacos-discovery依赖:
<!-- nacos服务注册与发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.2 配置文件
配置nacos注册中心
server:
port: 18082
servlet:
context-path: /
spring:
application:
name: app-order #应用名称 (nacos会将该名称当做服务名称)
#nacos注册中心地址
cloud:
nacos:
server-addr: 192.168.xxx.xxx:8848
discovery:
username: nacos
password: nacos
关于 Nacos Starter 更多的配置项信息:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
2.3 启动order服务
启动服务,在 nacos管理端界面可查看是否成功注册。
@SpringBootApplication
//@EnableDiscoveryClient # nacos新版本不需要再加 @EnableDiscoveryClient注解了
public class AppOrderApplication {
public static void main(String[] args) {
SpringApplication.run(AppOrderApplication.class, args);
}
@Bean
@LoadBalanced // Nacos注册中心,默认使用 Ribbon 负载均衡
public RestTemplate restTemplate(RestTemplateBuilder builder){
RestTemplate restTemplate = builder.build();
return restTemplate;
}
}
3、创建user服务
创建 app-user服务,服务消费者可以通过 Nacos 的服务注册发现功能,从 Nacos server 上获取到它要调用的服务。同 app-order服务同理。同 order服务同理。
3.1 引入依赖
当前项目pom中引入服务发现 nacos-discovery依赖:
<!-- nacos服务注册与发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.2 配置文件
配置nacos注册中心
server:
port: 18081
servlet:
context-path: /app-user
spring:
application:
name: app-user #微服务名称
#配置nacos注册中心地址
cloud:
nacos:
discovery:
server-addr: 192.168.xxx.xxx:8848
4、测试
4.1 开启负载均衡
开启 @LoadBalanced 与 Ribbon 的集成。使用 RestTemplate进行服务调用。
// @Bean
// @LoadBalanced
// public RestTemplate restTemplate() {
// return new RestTemplate();
// }
// 推荐builder模式创建 RestTemplate
@Bean
@LoadBalanced // Nacos注册中心,默认使用 Ribbon 负载均衡
public RestTemplate restTemplate(RestTemplateBuilder builder){
RestTemplate restTemplate = builder.build();
return restTemplate;
}
4.2 使用 RestTemplate进行服务调用
写一个 controller调用。
@RequestMapping(value = "/findOrderByUserId/{id}")
public R findOrderByUserId(@PathVariable("id") Integer id) {
log.info("根据userId=" + id + "查询订单信息");
// restTemplate调用, url写死
//String url = "http://localhost:18082/order/findOrderByUserId/" + id;
/**
* Nacos注册中心,默认使用 Ribbon 负载均衡,restTemplate需要添加@LoadBalanced注解。
* 使用微服务名:ip:port替换为app-order
*/
String url = "http://app-order/order/findOrderByUserId/" + id;
R result = restTemplate.getForObject(url, R.class);
return result;
}
浏览器访问测试ok:http://localhost:18081/app-user/user/findOrderByUserId/1,返回数据:
到此,Nacos做注册中心使用就OK了。
二、服务隔离配置
Namespace 和 Group配置项使用场景也是蛮多的。
1、Namespace 隔离
Namespace:命名空间,默认是空串,即公共命名空间(public)用于进行租户(用户)粒度的隔离。对相同特征的服务进行归类分组管理。需要创建 Namespace,指定其id。
Namespace 的常用场景之一是不同环境的隔离,例如:项目/开发/测试/生产环境的资源(如配置、服务)隔离等。
修改app-user服务的yml配置:通过spring.cloud.nacos.discovery.namespace参数配置
#nacos注册中心地址
cloud:
nacos:
server-addr: 192.168.xxx.xxx:8848
discovery:
username: nacos
password: nacos
namespace: b4d0832b-a7b0-44c2-8ce5-1abe676a4736 # 必须使用命名空间id
启动app-user,进入nacos控制台可以看到appl-user注册成功,所属 namespace是appl-service。
访问测试:http://localhost:8040/user/findOrderByUserId/1,报错:找不到 app-order实例服务。
原因:app-order和app-user使用了不同的 namespace,导致服务隔离。
我们把app-orser配置 namespace也指定为appl-service时,访问就ok了。
2、group服务分组
不同的服务可以归类到同一个namespace时,还可以使用 group继续更细粒度的归类管理。也可以进一步起到服务隔离的作用。不需要创建group,直接指定即可。
修改app-user服务的yml配置:通过spring.cloud.nacos.discovery.group参数配置
#nacos注册中心地址
cloud:
nacos:
server-addr: 192.168.xxx.xxx:8848
discovery:
username: nacos
password: nacos
namespace: b4d0832b-a7b0-44c2-8ce5-1abe676a4736 # 必须使用命名空间id
group: prod
启动app-user,进入nacos控制台可以看到appl-user注册成功,所属 namespace是appl-service,group是prod。
访问测试:http://localhost:8040/user/findOrderByUserId/1,报错:找不到 app-order实例服务。
原因:app-order和app-user使用了相同的 namespace,但是groupb不同,导致服务隔离。
我们把app-orser配置 group也指定为prod时,访问就ok了。
– 求知若饥,虚心若愚。