Spring Cloud Alibaba 实操 (二) 服务注册与发现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
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中,我们可以很方便的去切换服务治理方面的中间件。

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
22天前
|
Java API 微服务
【Spring Boot系列】通过OpenAPI规范构建微服务服务接口
【4月更文挑战第5天】通过OpenAPI接口构建Spring Boot服务RestAPI接口
|
4天前
|
安全 Linux Nacos
如何使用公网地址远程访问内网Nacos UI界面查看注册服务
如何使用公网地址远程访问内网Nacos UI界面查看注册服务
16 0
|
16天前
|
Java 数据安全/隐私保护 Sentinel
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
|
17天前
|
负载均衡 Cloud Native Java
Nacos 注册中心(2023旧笔记)
Nacos 注册中心(2023旧笔记)
18 0
|
17天前
|
Java API Nacos
第十二章 Spring Cloud Alibaba Sentinel
第十二章 Spring Cloud Alibaba Sentinel
27 0
|
17天前
|
存储 前端开发 Java
第十一章 Spring Cloud Alibaba nacos配置中心
第十一章 Spring Cloud Alibaba nacos配置中心
22 0
|
17天前
|
消息中间件 SpringCloudAlibaba Java
第十章 SpringCloud Alibaba 之 Nacos discovery
第十章 SpringCloud Alibaba 之 Nacos discovery
|
17天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
22天前
|
Java Maven Nacos
Spring Cloud Eureka 服务注册和服务发现超详细(附加--源码实现案例--及实现逻辑图)
Spring Cloud Eureka 服务注册和服务发现超详细(附加--源码实现案例--及实现逻辑图)
31 0
|
25天前
|
Java API 对象存储
对象存储OSS产品常见问题之使用Spring Cloud Alibaba情况下文档添加水印如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
30 2