前言

本文主要介绍SpringCloud使用Nacos当配置中心和注册中心,通过一个简单的Demo学习Naocs的基本配置以及不同微服务之间通过RestTemplate 及openfeign完成接口调用。

Nacos的安装配置

Nacos的学习资源主要有以下两个

  1. Nacos管网 Nacos管网
  2. Nacos GitHub NacosGitHub

下载Nacos

直接从GitHub https://github.com/alibaba/nacos/releases下载对应版本的Nacos,本文使用2.1.0,没有GitHub加速的可以直接从CSDN下载,我上传的,完全免费,不需要积分

启动Naocs

如果是Windows 修改startup.cmd中的配置set MODE="standalone"配置成单机模式,然后点击startup.cmd运行就可以启用Nacos了,也可以使用startup.sh -m standalone 指定启动模式。

springCloud整合Nacos当配置中心和注册中心_用户中心


当我们看到 8848后,说明启动成功,浏览器输入http://127.0.0.1:8848/nacos/,用户名nacos,密码nacos就可以登录进入Nacos了。

配置nacos

springCloud整合Nacos当配置中心和注册中心_用户中心_02


进入Nacos后有几个概念需要简单说明一下

命名空间

可以理解成不同的环境,比如dev/test/prod对应开发/测试/正式,我们可以分别创建这三个环境,注意命名空间ID(不填则自动生成)我们就不填,让他自动生成好了。

springCloud整合Nacos当配置中心和注册中心_后端_03

配置列表

配置列表就是替代我们以前项目的中yml或者properties文件,我们选择dev环境创建一个DataID为user-service Group为Shop,这里DataID可以理解成对应我们的一个微服务,Group可以理解成我们的一个项目,我们做一个商城,会有用户中心,订单中心。这里商城项目可以理解成Group,用户中心可以理解成Data ID。

springCloud整合Nacos当配置中心和注册中心_微服务_04

服务管理

这里服务管理就对应我们的一个微服务,当我们的微服务启动后会自动注册到这里来,目前还没有数据

springCloud整合Nacos当配置中心和注册中心_用户中心_05

SpringCloud环境搭建

我们做一个非常简单的Demo,基本逻辑就是启用一个用户中心,里面从nacos配置中心拉取用户配置,然后对应提供一个接口通过ID获取用户信息,在订单中心中创建一个接口,调用用户中心的接口获取用户信息,基本项目架构如下图:

springCloud整合Nacos当配置中心和注册中心_spring_06


这里我们引用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

springCloud整合Nacos当配置中心和注册中心_用户中心_07

我们通过nacos上显示的IP及端口 http://192.168.1.103:82/user/1,可以成功的获取nacos的配置信息

springCloud整合Nacos当配置中心和注册中心_微服务_08

订单中心

订单中心配置

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及端口访问对应接口,完成对用户中心服务的调用

springCloud整合Nacos当配置中心和注册中心_后端_09


输入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

springCloud整合Nacos当配置中心和注册中心_微服务_10

springCloud整合Nacos当配置中心和注册中心_spring cloud_11

可以看到nacos后台user-service有两个实例了

springCloud整合Nacos当配置中心和注册中心_后端_12


调用order-service时是不同user-service提供的,达到负载均衡的作用。

springCloud整合Nacos当配置中心和注册中心_微服务_13

最后

本文是学习nacos的入门篇,后续还会学习更多nacos相关内容
项目源码:https://gitee.com/whzhaochao/nacos-study