二.SpringCloudAlibaba极简入门-服务注册与发现Nacos

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 在《Spring Cloud 极简入门》中我们学习了netflix 的 Eureka 组件作为微服务的服务发现。Nacos和Eureka有着相同的能力,甚至更为强大,作为Dubbo 生态系统中重要的注册中心实现。官方对它有如下定义:Nacos致力于帮助您发现,配置和管理微服务。它提供了一组简单有用的功能,使您能够实现动态服务发现,服务配置,服务元数据和流量管理。Nacos使构建,交付和管理微服务平台变得更容易,更快捷。它是通过微服务或云原生方法支持以服务为中心的现代应用程序体系结构的基础架构。这里我们看到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
在这里插入图片描述
登录成功之后:
在这里插入图片描述

3.演示案例分析

3.1.服务调用流程

我们这里要演示的案例是两个服务的通信,用户服务(user-server)作为服务提供者需要编写接口返回User实体对象,订单服务(order-server)作为消费者需要调用用户服务获取User实体对象,浏览器调用订单服务,订单服务调用用户服务或到User实体后返回给容器,用户和订单都注册到Nacos中,如下:
在这里插入图片描述
注意:这里的订单服务和用户服务都用到了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已经注册进去了
在这里插入图片描述

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)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
15天前
|
网络安全 Nacos 开发者
Nacos作为流行的微服务注册与配置中心,“节点提示暂时不可用”是常见的问题之一
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。然而,“节点提示暂时不可用”是常见的问题之一。本文将探讨该问题的原因及解决方案,帮助开发者快速定位并解决问题,确保服务的正常运行。通过检查服务实例状态、网络连接、Nacos配置、调整健康检查策略等步骤,可以有效解决这一问题。
29 4
|
15天前
|
Java 网络安全 Nacos
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。然而,实际使用中常遇到“客户端不发送心跳检测”的问题。本文深入探讨该问题的原因及解决方案,帮助开发者快速定位并解决问题,确保服务正常运行。通过检查客户端配置、网络连接、日志、版本兼容性、心跳策略、注册状态、重启应用和环境变量等步骤,系统地排查和解决这一问题。
36 3
|
15天前
|
安全 Nacos 数据库
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改。本文详细探讨了这一问题的原因及解决方案,包括限制公网访问、使用HTTPS、强化数据库安全、启用访问控制、监控和审计等步骤,帮助开发者确保服务的安全运行。
29 3
|
1月前
|
存储 算法 Java
Nacos学习圣经:从入门到精通 Nacos,最全详解
本文,就是 Nacos 学习圣经,帮助大家彻底掌握 阿里 的核心组件, nacos 。 Nacos学习圣经 正式版本会有更新, 。
Nacos学习圣经:从入门到精通 Nacos,最全详解
|
23天前
|
数据管理 Nacos 开发者
"Nacos架构深度解析:一篇文章带你掌握业务层四大核心功能,服务注册、配置管理、元数据与健康检查一网打尽!"
【10月更文挑战第23天】Nacos 是一个用于服务注册发现和配置管理的平台,支持动态服务发现、配置管理、元数据管理和健康检查。其业务层包括服务注册与发现、配置管理、元数据管理和健康检查四大核心功能。通过示例代码展示了如何在业务层中使用Nacos,帮助开发者构建高可用、动态扩展的微服务生态系统。
68 0
|
23天前
|
SQL 关系型数据库 数据库连接
"Nacos 2.1.0版本数据库配置写入难题破解攻略:一步步教你排查连接、权限和配置问题,重启服务轻松解决!"
【10月更文挑战第23天】在使用Nacos 2.1.0版本时,可能会遇到无法将配置信息写入数据库的问题。本文将引导你逐步解决这一问题,包括检查数据库连接、用户权限、Nacos配置文件,并提供示例代码和详细步骤。通过这些方法,你可以有效解决配置写入失败的问题。
49 0
|
1月前
|
Java Nacos 开发工具
Nacos入门到精通
本文详细介绍了Nacos的基本概念、安装过程、配置管理功能,并通过具体代码示例展示了如何使用Java SDK和Spring Boot拉取和监听Nacos中的配置信息。
54 0
Nacos入门到精通
|
2月前
|
Kubernetes Nacos 容器
nacos注册不上
我正在使用开源的Nacos,并已在Kubernetes中部署了Nacos服务,通过端口映射可在集群外访问Nacos控制台。Kubernetes使用NodePort类型暴露了8848、9848、9849、7848和9555端口,但在尝试注册时遇到问题,出现“Client not connected, current status: STARTING”的错误,导致启动失败。
|
3月前
|
Java Nacos Docker
"揭秘!Docker部署Seata遇上Nacos,注册成功却报错?这些坑你不得不防!一网打尽解决秘籍,让你的分布式事务稳如老狗!"
【8月更文挑战第15天】在微服务架构中,Nacos搭配Seata确保数据一致性时,Docker部署Seata后可能出现客户端连接错误,如“can not connect to services-server”。此问题多由网络配置不当、配置文件错误或版本不兼容引起。解决策略包括:调整Docker网络设置确保可达性;检查并修正`file.conf`和`registry.conf`中的Nacos地址和端口;验证Seata与Nacos版本兼容性;修改配置后重启服务;参考官方文档和最佳实践进行配置。通过这些步骤,能有效排除故障,保障服务稳定运行。
273 0
|
3月前
|
Kubernetes Nacos 微服务
【技术难题破解】Nacos v2.2.3 + K8s 微服务注册:强制删除 Pod 却不消失?!7步排查法+实战代码,手把手教你解决Nacos Pod僵死问题,让服务瞬间满血复活!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但有时会遇到“v2.2.3 k8s 微服务注册nacos强制删除 pod不消失”的问题。本文介绍此现象及其解决方法,帮助开发者确保服务稳定运行。首先需检查Pod状态与事件、配置文件及Nacos配置,确认无误后可调整Pod生命周期管理,并检查Kubernetes版本兼容性。若问题持续,考虑使用Finalizers、审查Nacos日志或借助Kubernetes诊断工具。必要时,可尝试手动强制删除Pod。通过系统排查,通常能有效解决此问题。
78 0
下一篇
无影云桌面