计算机系统应用教程网站

网站首页 > 技术文章 正文

SpringCloud-Nacos实现服务的注册与发现(一)

btikc 2024-09-20 14:52:00 技术文章 26 ℃ 0 评论

Nacos安装及注册发现服务

前一篇文章主要介绍我们基于SpringCloudAlibaba自研的TechEd服务平台概览,计划采用一些文章来说明学习和建设的过程。在TechEd服务平台与之前建设的服务最大的区别是从Eureka转到阿里的Nacos服务中。原因既有奈飞各种组件慢慢闭源的因素,Nacos在国内用户越来越多,特别是2.0版本发行后,无论稳定性还是性能都有极大的提升;但更多的还是内部因素,从2016年12月份开始使用奈飞SpringCloud组件,再次转到Nacos,过程虽然艰辛,但在学习开发中,仍然是令人愉悦的。

接下来这个主题主要是分享Nacos学习过程,在主题的最后,会将目前TechEd使用Nacos的方案作为实际案例与大家分享和学习。

什么是Nacos

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。(Nacos Docs:https://nacos.io/zh-cn/docs/what-is-nacos.html)

在以前的服务架构中主要使用了Eureka作为注册中心,Spring Cloud Config作为配置中心,在TechEd服务架构中,采用了Nacos作为微服务的注册中心以及配置管理中心。

安装Nacos

下载地址:https://github.com/alibaba/nacos/releases

示例版本:1.3.2。20年末爆发了Naocs漏洞,1.3.2之前的版本无法启用身份认证,匿名可访问查询、修改、删除等API,因此建议采用1.3.2+版本。如果Nacos服务不考虑对外开放,问题也不大。

下载完成后解压,在nacos/bin中提供了不同平台的启动脚本

  • Windows:cmd startup.cmd -m standalone
  • Linux:./startup.sh -m standalone

默认情况下,没有启用数据持久化,参数-m standalone表明是以独立方式启动。

直接访问将自动登录,默认账号:nacos/nacos

启动完成之后,在浏览器中访问:http://localhost:8848,即可进入Nacos管理页面,此时服务部署完成。

应用接入Nacos

在这里采用两个简单的服务,一个作为服务提供者,一个作为消费者,来实现服务注册到Nacos的整个流程。

服务提供者

(一):先创建一个Maven项目,命名为:nacos-discovery,之后实现SpringBoot的配置,同时调整部分pom配置。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.6.RELEASE</version>
    <relativePath/> 
</parent>

<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>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>               
            <version>Hoxton.SR7</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.3.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
    </dependencies>
</dependencyManagement>
  • parent,确定springboot版本,这里采用了2.2.6.RELEASE版本,与springcloud版本相对应
  • spring-cloud-starter-alibaba-nacos-discovery,实现Nacos服务注册与发现,依赖于dependencyManagement中配置的版本号
  • 确定springcloud版本为Hoxton.SR7,alibabacloud版本为2.2.3.RELEASE(该版本支持注册及配置中心用户名及密码认证模式)

(二):POM配置完成后,使用IDEA的导入功能,完成各个组件的导入工作,之后在resources中添加application.yml配置文件,实现如下配置

server:
  port: 8700
spring:
  application:
    name: @project.artifactId@
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

这里仅配置了Nacos的服务地址为127.0.0.1:8848,将注册到默认的public命名空间下。

yml中通过@@包裹的字符串形式访问项目POM中的配置信息,如上面的name、description、version,按照路径的写法可以访问到POM中所有配置的信息。

properties文件通过${}形式访问POM中的配置信息。

默认创建项目后,直接配置启动此时显示的原始字符串,并没有读取到POM中的配置信息,需要在POM的build节点中添加以下信息

<resources>

<resource>

<directory>src/main/resources</directory>

<filtering>true</filtering>

</resource>

</resources>

此时再次编译启动,将对yml文件的@@字符使用POM中的信息进行替换,在编译后或打包后的文件中查看application.yml文件,发现@project.name等信息已被替换为真实数据信息。

(三):创建启动类,并完成测试接口的开发

@SpringBootApplication
@EnableDiscoveryClient
public class NacosDiscoveryApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosDiscoveryApplication.class, args);
    }

    @RestController
    public class HelloClass {
        @GetMapping("/hi")
        public String hello(@RequestParam("name") String name) {
            System.out.println("服务被调用");
            return "hi " + name;
        }
    }
}

Application启动类的开发和Eureka相同,添加了SpringBootApplicationEnableDiscoveryClient,标识这是一个springboot应用,且实现了服务的注册发现。并实现了一个简单的测试接口。

(四):以上完成后,启动多个多个实例

java -jar nacos-discovery-1.0-SNAPSHOT.jar
java -jar nacos-discovery-1.0-SNAPSHOT.jar --server.port=8701

第一个默认使用application.yml中配置的8700端口,另外一个实例使用8701端口。此时查看Nacos控制台,发现服务的信息和数量和启动一致。

服务消费者

服务消费者的创建参考服务提供者,两者基本上一致。

(一):先创建一个Maven项目,命名为:nacos-client,之后的POM配置和服务提供者一致

(二):在resources中添加application.yml配置文件,实现如下配置

server:
  port: 8800
spring:
  application:
    name: @project.artifactId@
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

除了端口外,其他和服务提供者一致。

(三):创建启动类,并完成测试接口的开发,在测试接口中完成服务提供接口的消费

@SpringBootApplication
@EnableDiscoveryClient
public class NacosClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosClientApplication.class, args);
    }

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

    @RestController
    public class ClientClass {
        @Autowired
        RestTemplate restTemplate;

        @GetMapping("/consumer")
        public String consumer(@RequestParam("name") String name) {
          return restTemplate.getForObject("http://nacos-discovery/hi?name=" + name, String.class);
        }
    }
}

调用服务时,采用了RestTemplate方案,并实现了负载均衡功能,用于测试上面启动的两个服务提供者实例。

(四):启动服务消费者,并测试接口

启动后,观察Nacos控制台,此时除了上面启动的两个服务提供者外,新增了服务消费者实例。

在浏览器中访问http://localhost:8800/consumer?name=world,并经过多次刷新,观察提供者控制台

通过服务提供者控制台的观察,在调用接口时,多个服务实例,被依次调用,实现了负载均衡。此处的表现和Eureka下完全一致。

相关示例资源

  • nacos-discovery:https://github.com/linanyi/nacos-discovery
  • nacos-client:https://github.com/linanyi/nacos-client

基于SpringCloudAlibaba微服务架构设计及实现系列文章

  1. 基于SpringCloudAlibaba微服务架构设计及实现

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表