springcloud+nacos初体验

当在微服务项目中不同模块之间需要实现服务调用时,都是通过注册中心来实现,目前常见的注册中心如下:

  • Eureka(原生,2.0遇到瓶颈,停止维护)
  • Zookeeper(支持,专业的独立产品。例如:dubbo)
  • Consul(原生,GO语言开发)
  • Nacos
    相对于 Spring Cloud Eureka 来说,Nacos 更强大。
    Nacos = Spring Cloud Eureka + Spring Cloud Config
    Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config。

下面介绍Nacos基础设施服务作为注册中心及springcloud+nacos的简单应用。
一、Nacos
Nacos(Dynamic Naming and Configuration Service),是阿里巴巴推出来的一个开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
在这里插入图片描述
1、Nacos 的关键特性

  • 服务发现:支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
  • 服务健康监测:提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
  • 动态配置服务:动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

  • 更多查看nacos中文网。

2、Nacos实现服务注册与发现的示意图如下(摘自官网)
在这里插入图片描述
3、Nacos下载安装
下载地址如下https://github.com/alibaba/nacos/releases
在这里插入图片描述
选择指定的环境、稳定的版本的zip包,解压到指定目录即可,如下
在这里插入图片描述
在本地创建数据库,执行nacos-mysql.sql文件;修改application.properties文件,将数据库配置改为本地数据库,如下
在这里插入图片描述
进入bin目录,启动命令,startup.cmd -m standalone启动nacos服务。
在这里插入图片描述
打开浏览器,访问地址http://localhost:8848/nacos/
在这里插入图片描述
账号密码默认为:nacos
在这里插入图片描述
Nacos环境启动完成。

4、注册中心和配置中心
分布式系统中,包含多个独立的服务,服务之间存在需要调用的需求,应该如何调用?
服务调用时必须知道目标服务实例的 IP、端口、API 接口,知道了目标服务实例的地址,就相当于发现了对方。当服务实例很少的时候,每个服务可以自己维护相关服务实例的地址信息,相当于通讯录,但当服务实例很多后,自己维护就很麻烦了,这就出现了注册中心。
每个服务实例启动之后,都主动向注册中心登记自己的地址信息,这样注册中心便拥有了所有服务实例的记录,当某个服务实例停止运行的时候,主动让注册中心销毁自己的信息。若要能够实时知道每个服务实例的状态,通过心跳机制来实现,维护所有的服务实例。

每个服务都会有自己的配置信息,例如 SpringBoot 项目中的配置文件,服务运行时会读取配置文件中的配置项。当修改配置文件时需要重新部署此服务的所有实例,又很麻烦。如果把服务的配置信息提出来,不放在自己的配置文件中,而是放到一个第三方的配置中心,服务实例从配置中心读取属于自己的配置,而且,在配置中心里面修改配置项之后,所有相关实例都可以立即拿到最新值,不用重新部署了,这样就方便很多。配置中心中集中维护优于分散式的维护每个服务的配置文件,且配置修改后直接生效,不用重新部署。

二、springcloud+nacos
Nacos是可以代替SpringCloud Eureka和SpringCloud Config的开源组件,直接下载最新的稳定版即可,windows下通过start -m standalone命令启动服务。
面向springcloud的使用者,通过引入如下依赖来实现分布式环境下的配置管理和服务注册发现:

  • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。
  • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>${latest.version}</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>${latest.version}</version>
</dependency>

注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。
1、搭建一个Spring Cloud父工程,只包含pom文件,然后基于该父工程,分别创建服务提供者和服务消费者模块。父工程的pom文件核心依赖如下

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

	<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>

        <!-- spring cloud -->
        <spring-cloud.version>2021.0.2</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>

        <!-- db && orm -->
        <mysql.version>8.0.19</mysql.version>
        <druid.version>1.2.4</druid.version>
        <mybatis-plus.version>3.4.3</mybatis-plus.version>

        <!-- tools -->
        <lombok.version>1.18.18</lombok.version>
        <hutool.version>5.7.21</hutool.version>
        <mapstruct.version>1.5.0.RC1</mapstruct.version>

    </properties>
    
	<modules>
        <module>msbd-gateway</module>

        <module>mall-order</module>
        <module>mall-product</module>
    </modules>

	<dependencyManagement>
        <dependencies>
            <!--Spring Cloud 相关依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--Spring Cloud & 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>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

2、服务提供者
pom依赖

		<!-- Spring Cloud & Alibaba -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        <!-- 注册中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

        <!-- 配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

bootstrap.yml文件

spring:
  application:
    name: mall-product
  profiles:
    active: dev

server:
  port: 8804

spring:
  main:
    allow-circular-references: true
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
  cloud:
    nacos:
      # 注册中心
      discovery:
        server-addr: http://localhost:8848
      # 配置中心
      config:
        # 本地启动
        ## server-addr: ${spring.cloud.nacos.discovery.server-addr}
        server-addr: http://localhost:8848

启动类

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class ProductBootApplication {

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

}

接口

@RestController
@RequestMapping("/product")
public class ProductController {

    @GetMapping("/hello")
    public Object hello() {
        return "hello, this is product service";
    }

}

3、服务消费者
pom依赖

		<!-- Spring Cloud & Alibaba -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        <!-- 注册中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

        <!-- 配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

		<!-- 远程调用HTTP客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

bootstrap.yml文件

spring:
  application:
    name: mall-order
  profiles:
    active: dev

server:
  port: 8803

spring:
  main:
    allow-circular-references: true
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
  cloud:
    nacos:
      # 注册中心
      discovery:
        server-addr: http://localhost:8848
      # 配置中心
      config:
        # 本地启动
        ## server-addr: ${spring.cloud.nacos.discovery.server-addr}
        server-addr: http://localhost:8848

启动类

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class OrderBootApplication {

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

}

接口

@RestController
@RequestMapping("/order")
@RequiredArgsConstructor
public class OrderController {

    private final ProductFeignClient productFeignClient;

    @GetMapping("/hello")
    public Object hello() {
        return "hello, this is order service";
    }

    @GetMapping("getHelloFromProduct")
    public Object getHelloFromProduct() {
        Object result = productFeignClient.getHello();
        return result;
    }
}

4、测试
先启动Nacos服务,然后启动服务提供者和服务消费者服务,访问如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
感兴趣的小伙伴可以试试,亲身体验其功能,理解其底层原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值