Spring Cloud Alibaba: Nacos-服务注册与发现

前言

本文主要记录nacos服务端搭建以及如何使用Nacos作为服务注册中心实现服务的注册与服务发现。

一、 Nacos简介

1.1 简介

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

1.2 主要功能:

  • 动态配置服务: 动态配置服务让您能够以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单,也让按需弹性扩展服务更容易。

  • 服务发现及管理: 动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服务发现。Nacos也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助Nacos,您可以更容易地为您的服务实现断路器。

  • 动态DNS服务: 通过支持权重路由,动态DNS服务能让您轻松实现中间层负载均衡、更灵活的路由策略、流量控制以及简单数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以消除耦合到厂商私有服务发现API上的风险。

二、Nacos服务端搭建

2.1 下载Nacos服务端

下载地址:https://github.com/alibaba/nacos/releases
上面的下载地址可以直接打开,滑动页面,选择合适版本进行下载。本次我选择了:2.0.0-ALPHA.2 ,如下图所示:
在这里插入图片描述

2.2 启动单机版Nacos

下载完成之后,解压。根据不同平台,执行不同命令,启动单机版Nacos服务:

  • Linux/Unix/Mac:sh startup.sh -m standalone
  • Windows:cmd startup.cmd -m standalone
    启动过程如下图所示:
    在这里插入图片描述
    启动完成之后,访问:http://127.0.0.1:8848/nacos/,可以进入Nacos的服务登录页面,使用用户名密码nacos nacos 登录,进图到管理页面,具体如下;
    在这里插入图片描述
    ’登录完成,进入nacos管理平台,界面如下图所示:
    在这里插入图片描述

三、Nacos客户端

需要一定的SpringBoot基础,不熟悉的可以参考:https://blog.csdn.net/u014553029/category_7788769.html

服务提供者(库存服务) <-- 服务消费者(订单服务,下单时候调用库存服务扣库存)

3.1 服务提供者

3.1.1 创建一个Spring Boot应用,命名为:stock-service

3.1.2 编辑pom.xml,加入必要的依赖配置,如下:

<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
    <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
    <lombok.version>1.18.16</lombok.version>
</properties>

<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>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency> 
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

<!-- 依赖声明 -->
<dependencyManagement>
    <dependencies>
        <!-- SpringCloud 微服务 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- SpringCloud Alibaba 微服务-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
 

3.1.3 添加配置:

 # 应用名称
spring:
  application:
    name: stock-service
  # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
  # Nacos认证信息
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        # Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
        server-addr: 127.0.0.1:8848
        # 注册到 nacos 的指定 namespace,默认为 public
        namespace: public
  # 应用服务 WEB 访问端口
server:
  port: 8101
  servlet:
    context-path: /

3.1.4 编写测试类:

/**
 * @Description: 库存服务测试控制类
 * @Author oyc
 * @Date 2020/12/30 11:48 下午
 */
@RestController
@RequestMapping
@Slf4j
public class StockController {
    
    
    @GetMapping
    public String hello() {
    
    
        log.info("invoked Hello,库存服务被调用了");
        return "invoked Hello,库存服务被调用了";
    }

    @GetMapping("stock/allocation")
    public String sale() {
    
    
        log.info("商品销售,开始减库存");
        return "减库存完成";
    }
}

3.1.5 在启动类添加 @EnableDiscoveryClient 注解,开启Spring Cloud的服务注册与发现,如下图所示:

@SpringBootApplication
@EnableDiscoveryClient
public class StockServiceApplication {
    
    

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

}

3.2 消费者

3.2.1 新增消费者springboot项目,命名为:order-service

3.2.2 添加pom依赖,与3.1.2中消费者依赖一致

3.2.3 配置

# 应用名称
spring:
  application:
    name: order-service
  # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
  # Nacos认证信息
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        # Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
        server-addr: 127.0.0.1:8848
        # 注册到 nacos 的指定 namespace,默认为 public
        namespace: public
  # 应用服务 WEB 访问端口
server:
  port: 8100
  servlet:
    context-path: /

3.2.4 添加RestTemplateConfiguration

@Configuration
public class RestTemplateConfiguration {
    
    

    @Bean
    @LoadBalanced//ribbon的负载均衡注解
    public RestTemplate restTemplate() {
    
    
        return new RestTemplate();
    }
}

3.2.5 添加测试类

@RestController
@RequestMapping
@Slf4j
public class OrderController {
    
    
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping
    public String hello() {
    
    
        log.info("invoked Hello,订单服务被调用了");
        return "invoked Hello,订单服务被调用了";
    }

    @GetMapping("sale")
    public String sale() {
    
    
        log.info("订单服务, 开始下单售卖商品");
        String stockServiceName = "stock-service";
        String stackUrl = String.format("http://stock-service/stock/allocation", stockServiceName);
        String forObject = restTemplate.getForObject(stackUrl, String.class);
        System.out.println(String.format("订单服务,商品完成售卖:%s", forObject));
        return "订单服务,商品完成售卖";
    }
}

3.2.6 在启动类添加@EnableDiscoveryClient注解,开启Spring Cloud的服务注册与发现

@SpringBootApplication
@EnableDiscoveryClient
public class OrderServiceApplication {
    
    

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

}

启动这两个项目

启动完成之后,可以在nacos管理平台中的服务管理–>服务列表中查看到已经注册的服务,如下图所示:
在这里插入图片描述

启动多个消费者,测试负载情况

以在启动时候增加-Dserver.port=8101的形式在本机的不同端口上启动多个实例。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
tips: 客户端负载均衡
通过Spring Cloud Ribbon封装,在微服务架构中实现客户端负载均衡中,可实现负载均衡,ribbon(轮询),只需要两步:

  • 服务提供者启动多个服务实例并注册到一个注册中心(或者是多个相关联的服务注册中心)。

  • 服务消费者通过调用被@LoadBalanced注解过的RestTemplate来实现面向服务的接口调用。

当我们访问订单服务进行模拟下单时,订单服务会通过resttemplate远程调用库存 服务实行扣取库存操作。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u014553029/article/details/113615049