SpringCloud微服务实践-(二)Nacos物理化部署及集成SpringCloud实现注册中心

25 阅读3分钟

基于JDK8+SpringBoot2.7.18, nacos server2.4.3

一、物理化安装

1、下载nacos-server二进制包

下载地址:nacos.io/download/na…

Clipboard_Screenshot_1736079681.png

2、上传至部署机器并进行解压

Clipboard_Screenshot_1736079306.png

3、修改nacos默认端口

vim /root/soft/nacos/conf/application.properties
#修改默认端口为10001
#server.port=8848
server.port=10001

4、启动单机版nacos

注:Nacos的运行建议至少在2C4G 60G的机器配置下运行

#执行以下命令快速启动
sh startup.sh -m standalone

5、访问nacos的控制台页面,验证nacos是否部署OK

Clipboard_Screenshot_1736080224.png

二、集成至SpringCloud,实现注册中心

1、父模块pom中添加nacos-discovery依赖包管理

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2021.0.6.2</version>
        </dependency>
    </dependencies>
</dependencyManagement>

2、对子模块服务提供者1进行配置

(1)pom中新增nacos-discovery依赖

<!-- nacos 注册中心 相关依赖 start -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos 注册中心 相关依赖 end -->

(2)application.yaml中新增nacos注册中心相关配置

spring:
  application:
    name: service-provider-1
  cloud:
    nacos:
      discovery:
        server-addr: nacos的ip:10001

(3)启动类中开启注册

@SpringBootApplication
@EnableDiscoveryClient # 添加该注解开启服务注册
public class App {
    ...
}

(4)定义一个接口,供服务消费者测试调用

@RestController
class ServiceProviderController {
    @RequestMapping(value = "/getResult/{string}", method = RequestMethod.GET)
    public String getResult(@PathVariable String string) {
        return "Hello, Nacos Discovery service-provider-1 return : " + string;
    }
}

3、对子模块服务提供者2进行配置

(1)pom中新增nacos-discovery依赖

<!-- nacos 注册中心 相关依赖 start -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos 注册中心 相关依赖 end -->

(2)application.yaml中新增nacos注册中心相关配置

spring:
  application:
    name: service-provider-2
  cloud:
    nacos:
      discovery:
        server-addr: nacos的ip:10001

(3)启动类中开启注册

@SpringBootApplication
@EnableDiscoveryClient # 添加该注解开启服务注册
public class App {
    ...
}

(4)定义一个接口,供服务消费者测试调用

@RestController
class ServiceProviderController {
    @RequestMapping(value = "/getResult/{string}", method = RequestMethod.GET)
    public String getResult(@PathVariable String string) {
        return "Hello, Nacos Discovery service-provider-2 return : " + string;
    }
}

4、对子模块服务消费者1进行配置

(1)pom中新增nacos-discovery依赖

<!-- nacos 注册中心 相关依赖 start -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos 注册中心 相关依赖 end -->

<!-- 微服务调用 相关依赖 start -->
<!-- 不引入spring-cloud-starter-loadbalancer的话,消费者通过服务提供者名调用会报错:`UnknownHostException` 问题 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    <!-- 这里的版本和spring-cloud保持一致 -->
    <version>3.1.5</version>
    <type>pom</type>
</dependency>
<!-- 微服务调用 相关依赖 end -->

(2)application.yaml中新增nacos注册中心相关配置

spring:
  application:
    name: service-consumer-1
  cloud:
    nacos:
      discovery:
        server-addr: nacos的ip:10001

(3)启动类中开启注册

@SpringBootApplication
@EnableDiscoveryClient # 添加该注解开启服务注册
public class App {
    ...
}

(4)启动类中定义一个restTemplate的Bean

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

(5)定义两个接口,用于测试调用两个服务提供者定义的接口

@RestController
public class TestController {

    private final RestTemplate restTemplate;

    @Autowired
    public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}

    @RequestMapping(value = "/provider1/{str}", method = RequestMethod.GET)
    public String getResultFromServiceProvider1(@PathVariable String str) {
        // 这里通过服务提供者名service-provider-1调用定义的接口
        return restTemplate.getForObject("http://service-provider-1/getResult/" + str, String.class);
    }
    @RequestMapping(value = "/provider2/{str}", method = RequestMethod.GET)
    public String getResultFromServiceProvider2(@PathVariable String str) {
        // 这里通过服务提供者名service-provider-2调用定义的接口
        return restTemplate.getForObject("http://service-provider-2/getResult/" + str, String.class);
    }
}

5、启动三个服务(两个服务提供者+一个服务消费者),进行测试,结果如下:

(1)检查三个服务是否都已注册到nacos

Clipboard_Screenshot_1736090023.png

(2)访问验证

Clipboard_Screenshot_1736090173.png Clipboard_Screenshot_1736090200.png