Spring Cloud Alibaba 实操 (二) 服务注册与发现Nacos

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 服务注册与发现Nacos

1.什么是Nacos

《Spring Cloud 极简入门》中我们学习了netflix 的 Eureka 组件作为微服务的服务发现。Nacos和Eureka有着相同的能力,甚至更为强大,作为Dubbo 生态系统中重要的注册中心实现。官方对它有如下定义:

Nacos致力于帮助您发现,配置和管理微服务。它提供了一组简单有用的功能,使您能够实现动态服务发现,服务配置,服务元数据和流量管理。
Nacos使构建,交付和管理微服务平台变得更容易,更快捷。它是通过微服务或云原生方法支持以服务为中心的现代应用程序体系结构的基础架构。

这里我们看到Nacos不仅是服务发现组件,同时也是一个配置管理组件,也就是说它不仅可以用来取代Eureak作为注册中心, 也可以用来取代Spring Cloud Config 做配置统一管理。本篇文章意在探讨Nacos的服务注册与发现功能。

2.Nacos服务安装

官方提供了Nacos的服务端供我们下载使用,我们启动Nacos后将我们的微服务注册进入Nacos即可。

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

启动Nacos:解压后, windows执行bin目录下的startup命令 ,linux 执行 sh startup.sh -m standalone
访问Nacos,端口8848:http://127.0.0.1:8848/nacos/index.html ,用户名和密码都是:nacos
image.png

登录成功之后:
image.png

3.演示案例分析

3.1.服务调用流程

我们这里要演示的案例是两个服务的通信,用户服务(user-server)作为服务提供者需要编写接口返回User实体对象,订单服务(order-server)作为消费者需要调用用户服务获取User实体对象,浏览器调用订单服务,订单服务调用用户服务或到User实体后返回给容器,用户和订单都注册到Nacos中,如下:
image.png

注意:这里的订单服务和用户服务都用到了User实体,所以为了让User实体共用,我们为User实体抽取了一个公共的user-common模块,用户服务和订单服务都去依赖这个模块即可使用User实体。

3.2.项目结构搭建

我们根据上面的图例来搭建项目环境,这里使用多模块方式演示,搭建父工程,提供者服务,消费者服务,以及公共的user-common模块,结构如下:

springcloudalibaba-parent
pom.xml
    springcloudalibaba-user-common            //公共的user实体,服务调用传输对象
    springcloudalibaba-order-server-1020    //消费者服务
    springcloudalibaba-user-server-1010        //提供者服务

父工程搭建
搭建父工程springcloudalibaba-parent并管理相关依赖,Spring boot版本为2.1.3.RELEASE,Spring Cloud 版本为Greenwich.SR1,Alibaba版本为2.1.0.RELEASE ,父工程的pom如下:

<!--公共的一些配置-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
        <alibaba.version>2.1.0.RELEASE</alibaba.version>
        <spring-boot.version>2.1.13.RELEASE</spring-boot.version>
    </properties>

    <!--1.管理SpringBoot的依赖-->
    <parent>
        <groupId> org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>${spring-boot.version}</version>
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

4.提供者服务注册到Nacos

4.1.导入依赖

修改springcloudalibaba-user-server-1010导入服务发现依赖

 <dependency>
     <groupId>com.alibaba.cloud </groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--加入WEB依赖是为了方便后面写Controller-->
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
</dependency>

4.2.主配置类

创建配置类加上@EnableDiscoveryClient注解开启服务发现功能,代码如下

//服务注册与发现
@SpringBootApplication
@EnableDiscoveryClient
public class UserServerApplication1010 {
   
   
    public static void main(String[] args) {
   
   
        SpringApplication.run(UserServerApplication1010.class) ;
    }
}

4.3.配置文件

配置文件主要配置端口,服务名,已经nacos注册中心地址

server:
  port: 1010
spring:
  application:
    name: user-server
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848    #注册中心地址

4.4.启动测试

启动服务提供者,观察Nacos服务列表 , user-server已经注册进去了
image.png

5.服务消费者注册到Nacos

消费者服务(springcloudalibaba-order-server-1020)的所有流程和提供者服务一样,这里不再赘述,消费者的端口是 1020 ,服务名是order-server 。

分别启动2个工程,待工程启动成功之后,在访问localhost:8848,可以发现user-server和order-server,均已经向nacos-server注册

6.使用Ribbon进行服务通信

6.1.公共user模块

给springcloudalibaba-user-common添加user实体类

public class User {
   
   
    private Long id;
    private String name;
    private String intro;

    public User() {
   
   
    }

    public User(Long id, String name, String intro) {
   
   
        this.id = id;
        this.name = name;
        this.intro = intro;
    }
    //getter,setter...

6.2.服务提供者

修改springcloudalibaba-user-server-1010 的pom文件,依赖springcloudalibaba-user-common模块

<dependency>
       <groupId>org.example</groupId>
     <artifactId>springcloudalibaba-user-common</artifactId>
     <version>1.0-SNAPSHOT</version>
</dependency>

修改springcloudalibaba-user-server-1010 编写controller ,这个是向消费者暴露的访问接口。

@RestController
public class UserController {
   
   

    @GetMapping("/user/{id}")
    public User getById(@PathVariable Long id){
   
   
        return new User(id,"zs:"+id, "我是zs");
    }
}

6.3.消费者服务

修改springcloudalibaba-order-server-1020,修改pom导入user-common依赖

<dependency>
    <groupId>org.example</groupId>
    <artifactId>springcloudalibaba-user-common</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

修改springcloudalibaba-order-server-1020 ,在配置类定义RestTemplate,使用@LoadBalanced开启负载均衡,Nacos默认整合了Ribbon。
不知道Ribbon?点我

//服务注册与发现
@SpringBootApplication
@EnableDiscoveryClient
public class OrderServerApplication1020 {
   
   

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



    public static void main(String[] args) {
   
   
        SpringApplication.run(OrderServerApplication1020.class) ;
    }
}

创建controller,通过RestTemplate向用户服务发起请求

//订单消费者
@RestController
public class OrderController {
   
   
    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/order/{id}")
    public User getById(@PathVariable Long id){
   
   
        String url = "http://user-server/user/"+id;
        return restTemplate.getForObject(url,User.class);
    }
}

访问测试 : http://localhost:1020/order/3 , 返回从用户拿到的用户信息:

{
   
   "id":3,"name":"zs:3","intro":"我是zs"}

7.使用Feign进行服务通信

上面我们的消费者服务(order-server)通过Ribbon向提供者服务(user-server)发起调用并成功的获取到结果,当然我们也可以使用Feign实现服务的调用,集成方式和以前一模一样。还不知道Feign?点我

7.1.创建支付服务

创建新的工程springcloudalibaba-pay-server-1030 作为第二个消费者服务,同时依赖user-common模块,注册到Nacos,集成Feign和user-server通信,导入依赖如下:

 <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!-- 服务注册与发现-->
    <dependency>
      <groupId>com.alibaba.cloud </groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.example</groupId>
      <artifactId>springcloudalibaba-user-common</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>

7.2.主配置类

通过 @EnableFeignClients注解开启Feign。

//服务注册与发现
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients("org.example.feign.client")
public class PayServerApplication1030 {
   
   

    public static void main(String[] args) {
   
   
        SpringApplication.run(PayServerApplication1030.class) ;
    }
}

7.3.编写Feign接口

该接口作为Feign的客户端接口,用来调用用户服务(user-server)

@FeignClient("user-server")
public interface UserClient {
   
   

    @GetMapping("/user/{id}")
    User getById(@PathVariable Long id);
}

7.4.编写测试Controller

通过 UserClient Feign的客户端接来调用用户服务,获取User并返回。

@RestController
public class PayController {
   
   

    @Autowired
    private UserClient  userClient ;

    @RequestMapping("/pay/{id}")
    public User getById(@PathVariable Long id){
   
   
        return userClient.getById(id);
    }
}

7.5.访问测试

测试调用 :http://localhost:1030/pay/3 , 返回数据如下:

{
   
   "id":3,"name":"zs:3","intro":"我是zs"}

总结:

为什么我们可以在Spring Cloud Alibaba里面无缝兼容 Ribbon和Feign呢,这是因为Spring Cloud Comm包对SpringCloud的一些基本功能做了封装,比如在服务注册与发现、客户端负载均衡等方面都做了很好的抽象,而上层应用方面依赖的都是这些抽象接口,而非针对某个具体中间件的实现。所以,在Spring Cloud中,我们可以很方便的去切换服务治理方面的中间件。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
9月前
|
JSON Java Nacos
SpringCloud 应用 Nacos 配置中心注解
在 Spring Cloud 应用中可以非常低成本地集成 Nacos 实现配置动态刷新,在应用程序代码中通过 Spring 官方的注解 @Value 和 @ConfigurationProperties,引用 Spring enviroment 上下文中的属性值,这种用法的最大优点是无代码层面侵入性,但也存在诸多限制,为了解决问题,提升应用接入 Nacos 配置中心的易用性,Spring Cloud Alibaba 发布一套全新的 Nacos 配置中心的注解。
863 143
|
6月前
|
人工智能 自然语言处理 Java
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
5024 7
|
10月前
|
存储 Java Nacos
Spring Cloud+Nacos+KMS 动态配置最佳实践
本文讲述了 Spring Cloud 应用中结合 Nacos 实现了运行期配置动态更新的功能,以及在此基础上结合 KMS 在不改动代码的情况下对应用使用的敏感配置进行保护,解决将配置迁移到 Nacos 中可能存在的数据安全顾虑,并对其底层工作原理做了简单介绍。
1245 152
|
7月前
|
Cloud Native Java Nacos
springcloud/springboot集成NACOS 做注册和配置中心以及nacos源码分析
通过本文,我们详细介绍了如何在 Spring Cloud 和 Spring Boot 中集成 Nacos 进行服务注册和配置管理,并对 Nacos 的源码进行了初步分析。Nacos 作为一个强大的服务注册和配置管理平台,为微服务架构提供
2836 14
|
7月前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
379 7
|
9月前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
140 6
|
9月前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
160 5
|
9月前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
171 5
|
11月前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
829 1
Springcloud Alibaba + jdk17+nacos 项目实践
|
11月前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?