前言
本文主要介绍SpringCloud使用Nacos当配置中心和注册中心,通过一个简单的Demo学习Naocs的基本配置以及不同微服务之间通过RestTemplate 及openfeign完成接口调用。
Nacos的安装配置
Nacos的学习资源主要有以下两个
- Nacos管网 Nacos管网
- Nacos GitHub NacosGitHub
下载Nacos
直接从GitHub https://github.com/alibaba/nacos/releases下载对应版本的Nacos,本文使用2.1.0,没有GitHub加速的可以直接从CSDN下载,我上传的,完全免费,不需要积分https://download.csdn.net/download/whzhaochao/88074308
启动Naocs
如果是Windows 修改startup.cmd
中的配置set MODE="standalone"
配置成单机模式,然后点击startup.cmd
运行就可以启用Nacos了,也可以使用startup.sh -m standalone
指定启动模式。
当我们看到 8848后,说明启动成功,浏览器输入http://127.0.0.1:8848/nacos/,用户名nacos,密码nacos就可以登录进入Nacos了。
配置nacos
进入Nacos后有几个概念需要简单说明一下
命名空间
可以理解成不同的环境,比如dev/test/prod对应开发/测试/正式,我们可以分别创建这三个环境,注意命名空间ID(不填则自动生成)我们就不填,让他自动生成好了。
配置列表
配置列表就是替代我们以前项目的中yml或者properties文件,我们选择dev环境创建一个DataID为user-service Group为Shop,这里DataID可以理解成对应我们的一个微服务,Group可以理解成我们的一个项目,我们做一个商城,会有用户中心,订单中心。这里商城项目可以理解成Group,用户中心可以理解成Data ID。
服务管理
这里服务管理就对应我们的一个微服务,当我们的微服务启动后会自动注册到这里来,目前还没有数据
SpringCloud环境搭建
我们做一个非常简单的Demo,基本逻辑就是启用一个用户中心,里面从nacos配置中心拉取用户配置,然后对应提供一个接口通过ID获取用户信息,在订单中心中创建一个接口,调用用户中心的接口获取用户信息,基本项目架构如下图:
这里我们引用POM是有个注意事项:不同的SpingBoot版本和cloud-alibaba以及nacos可能是不兼容,我们可以从https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E查看对应的兼容版本
<properties>
<spring-boot-start-web.version>2.3.11.RELEASE</spring-boot-start-web.version>
<spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot-start-web.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
</project>
用户中心的 bootstrap.yml配置
这里我们主要看两个关键配置nacos.config和nacos.discovery, config主要是配置从nacos拉取配置信息,这里我们prefix就对应用我们nacos后台的user-service,namespace对应我们的开发环境,group就对应我们的项目shop。
server:
port: 82
spring:
profiles:
active: dev
application:
name: user-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
group: shop
enabled: true
prefix: user-service
namespace: 6835622b-e819-4a78-a4d0-3fdc12b29ae9
file-extension: yaml
discovery:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
namespace: 6835622b-e819-4a78-a4d0-3fdc12b29ae9
group: shop
依赖配置
<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>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
我们看一下UserConfig
这个类,通过这个类我们可以拉取nacos中配置的users.list数据。
@Configuration
@ConfigurationProperties("users")
@Data
public class UserConfig {
private List<User> list;
}
我们看一下UserController
这个类提供了一个/user/{id}
通过id获取nacos配置中心的用户信息。
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@Value("${server.port}")
private Integer port;
@Resource
private UserConfig userConfig;
@GetMapping("/{id}")
public User info(@PathVariable Long id){
return userConfig.getList().stream().filter(x->x.getId().equals(id)).peek(x-> x.setPort(port)).findFirst().get();
}
}
启用nacos-user项目,当我们启动nacos-user项目后,在nacos后台可以看到user-service,端口是82
我们通过nacos上显示的IP及端口 http://192.168.1.103:82/user/1,可以成功的获取nacos的配置信息
订单中心
订单中心配置
server:
port: 81
spring:
profiles:
active: dev
application:
name: order-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
group: shop
enabled: true
prefix: order-service
namespace: 6835622b-e819-4a78-a4d0-3fdc12b29ae9
file-extension: yaml
discovery:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
namespace: 6835622b-e819-4a78-a4d0-3fdc12b29ae9
group: shop
依赖配置
<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.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
订单中心,在订单中心我们写了两个接口/order/{id}
通过restTempate
调用用户中心的接口和/order/feign/{id}
通过openFeign
调用用户中心的接口,这里需要注意的是 在配置RestTemplate
需要加上@LoadBalanced
,不然会找不到接口地址,加上后会使用ribon
负载均衡ribon
会从注册中心通过user-service找到对应的服务地址。
@RestController
@RequestMapping("/order")
public class OrderController {
@Resource
private RestTemplate restTemplate;
@Resource
private UserFeign userFeign;
@GetMapping("/{id}")
public User info(@PathVariable Long id){
return restTemplate.getForObject("http://user-service/user/".concat(id.toString()), User.class);
}
@GetMapping("/feign/{id}")
public User feign(@PathVariable Long id){
return userFeign.getUser(id);
}
}
@Configuration
public class RestTempleteConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@FeignClient(value = "user-service")
@Component
public interface UserFeign {
@GetMapping("user/{id}")
User getUser(@PathVariable Long id);
}
启动nacos-order
,在nacos的服务中会有一个order-service
,我们通过IP及端口访问对应接口,完成对用户中心服务的调用
输入http://192.168.1.103:81/order/1通过restTempate调用用户中心接口
输入http://192.168.1.103:81/order/feign/2通过openFeign调用用户中心接口
这里我们复制user-service启动配置然后覆盖service.port
启动两个user-service
可以看到nacos后台user-service有两个实例了
调用order-service时是不同user-service提供的,达到负载均衡的作用。
最后
本文是学习nacos
的入门篇,后续还会学习更多nacos
相关内容
项目源码:https://gitee.com/whzhaochao/nacos-study