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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月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中,我们可以很方便的去切换服务治理方面的中间件。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
10天前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
2月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
|
2月前
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
134 0
|
11天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
554 6
|
2月前
|
人工智能 前端开发 Java
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
本文介绍了如何使用 **Spring Cloud Alibaba AI** 构建基于 Spring Boot 和 uni-app 的聊天机器人应用。主要内容包括:Spring Cloud Alibaba AI 的概念与功能,使用前的准备工作(如 JDK 17+、Spring Boot 3.0+ 及通义 API-KEY),详细实操步骤(涵盖前后端开发工具、组件选择、功能分析及关键代码示例)。最终展示了如何成功实现具备基本聊天功能的 AI 应用,帮助读者快速搭建智能聊天系统并探索更多高级功能。
594 2
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
|
8天前
|
人工智能 前端开发 Java
Spring Cloud Alibaba AI,阿里AI这不得玩一下
🏀闪亮主角: 大家好,我是JavaDog程序狗。今天分享Spring Cloud Alibaba AI,基于Spring AI并提供阿里云通义大模型的Java AI应用。本狗用SpringBoot+uniapp+uview2对接Spring Cloud Alibaba AI,带你打造聊天小AI。 📘故事背景: 🎁获取源码: 关注公众号“JavaDog程序狗”,发送“alibaba-ai”即可获取源码。 🎯主要目标:
17 0
|
2月前
|
Dubbo Java 调度
揭秘!Spring Cloud Alibaba的超级力量——如何轻松驾驭分布式定时任务调度?
【8月更文挑战第20天】在现代微服务架构中,Spring Cloud Alibaba通过集成分布式定时任务调度功能解决了一致性和可靠性挑战。它利用TimerX实现任务的分布式编排与调度,并通过`@SchedulerLock`确保任务不被重复执行。示例代码展示了如何配置定时任务及其分布式锁,以实现每5秒仅由一个节点执行任务,适合构建高可用的微服务系统。
53 0
|
Dubbo Java 应用服务中间件
深入了解Spring Cloud Alibaba Dubbo
在现代分布式系统开发中,构建高性能、可伸缩性和弹性的微服务架构变得越来越重要。Spring Cloud Alibaba Dubbo(简称Dubbo)是一个开源的分布式服务框架,可以帮助开发者构建强大的微服务架构,具备负载均衡、服务治理、远程调用等强大功能。本文将深入介绍Spring Cloud Alibaba Dubbo,帮助你理解它的核心概念、工作原理以及如何在你的项目中使用它。
|
11月前
|
Kubernetes Java 微服务
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
123 0
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
|
5月前
|
Java 中间件 开发者
Spring Cloud Alibaba
【1月更文挑战第27天】【1月更文挑战第127篇】Spring Cloud Alibaba
123 1
下一篇
无影云桌面