计算机系统应用教程网站

网站首页 > 技术文章 正文

Spring Cloud(五):注册中心-nacos篇

btikc 2024-09-20 14:50:18 技术文章 21 ℃ 0 评论

大家好,我是杰哥,转眼间,我们的Spring Cloud专辑已到了第五次分享,而我们的注册中心篇章已经分别完成了Eureka、zookeeper篇,今天正式进入nacos篇的学习


nacos作为注册中心配置中心,这两年的热度还是挺高的。尤其是Eureka官方已经宣布Eureka2.0将会停止维护,naocs则变得更有优势。


它的版本更迭相对来说也比较快,按照目前的势头,相信会渐渐成长为Spring Cloud中配置中心和注册中心的独一无二的注册中心选择


本次文章只涉及nacos作为注册中心的部分功能,关于配置中心,则是我们注册中心篇结束之后的另一个篇章,敬请期待哦~



一 入门

初识nacos


01.什么是nacos


先来看看它的名字 Nacos,Na、co字母分别为 NamingConfiguration 的前两个字母,s 为Service


这个是官网上关于Nacos服务的分级存储模型



其实,分布式服务都基本如此。比如我们说,一个订单服务,可以分为不同环境,如开发、测试、生产环境,每个环境则是由一个集群构成,而每个集群,则是由一个个实例构成的


我们要调用一个服务,nacos会根据我们指定的服务名、集群名,根据负载均衡算法,动态路由到某个特定的服务实例,也就是说,我们最终调用的实际上是一个实例


总的来说,它是由阿里巴巴推出的一个开源项目,是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。可帮助我们快速实现动态服务发现服务配置服务元数据流量管理


02.有哪些特性 ?


1)服务发现和服务健康监测


支持基于 DNS 和基于 RPC 的服务发现

提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求


2)动态 DNS 服务


动态 DNS 服务支持权重路由,可以更容易地实现中间层负载均衡它使用Ribbon实现负载均衡)、更灵活的路由策略流量控制以及数据中心内网的简单DNS解析服务


它使用
Ribbon实现负载均衡


3)服务及其元数据管理


Nacos可以实现从微服务平台建设的视角,管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据

03.安装nacos注册中心


步骤比较简单


1)下载源码或者安装包

安装包地址:https://github.com/alibaba/nacos/releases


2)解压并启动


a Linux/Unix/Mac系统


启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone


b ubuntu系统

或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone


c Windows系统

启动命令:

cmd startup.cmd

或者双击startup.cmd运行文件


3)验证服务

启动成功之后,访问http://127.0.0.1:8848/nacos,输入默认用户名、密码:nacos/nacos,即可


好了,nacos注册中心已经就这样跑起来了~

由于实战环节,我们会涉及到使用Feign进行服务之间的远程调用,所以先简单介绍一下Feign

04.什么是feign


Feign是一个声明式的Web Service客户端,使得编写Web Service客户端变得非常容易,只需要创建一个接口,然后在上面添加注解即可实现服务远程调用


二 实战

demo跑起来



我们将分别演示如何实现生产者消费者,以及消费者如何调用生产者,针对多个生产者,消费者在调用时又是如何进行选择的这四个功能


由于生产者和消费者均为nacos的客户端,那么,他们需要引入的依赖以及注册中心的配置等基本一致。所以我们将它们放进同一个父项目:nacos_discovery中即可,最后的示例代码框架如下所示



01.建立父项目


建立父项目-nacos_discovery,配置其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.RELEASE</spring.cloud.version>
    <spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.3.RELEASE</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>
        <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>
<dependencies>
    <!--lombok工具依赖,可简化很多操作,如日志打印、构造方法、get\set方法等。-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
</dependencies>


需要注意的是,Spring Cloud与SpringBoot之间版本的对应关系,若关系配置不一致,则会出现服务注册不成功等问题


建立好了父级项目,接下来我们分别实现服务生产者和服务消费者

02.建立生产者


建立生产者,也就是说需要建立父级项目的子模块项目了,那么在IDEA中如何建立多模块的项目呢?


杰哥说,这个不难,follow me~


step 1 File -> Project Structure...



step2 选择Module ->点击“+”号,选择New Module



step3 类型项目选择Maven,并设置jdk



step4 选择父项目 nacos_discovery,填写项目名称:nacos_provider



step5 点击finish,子项目就建好了


此时查看nacos_provider的pom文件,发现它的parent依赖,就是我们选择的父项目nacos_discovery



而且父级项目的pom文件中也多了一个名称为nacos_provider的module



生产者的项目创建好了,接下来看看怎么去实现生产者呢?


我们先做个简单的分析:生产者首先需要把自己的服务发布在注册中心上,供消费者调用,那么就需要为它配置注册中心,并且需要发布服务


1) pom文件


<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.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
<!--       主要为了输出日志-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>


分别引入spring-cloud-starter-alibaba-nacos-discovery

spring-cloud-starter-openfeign,用于服务注册和开启允许被调用功能


2)application.yml配置文件


server:
  port: ${port:8860} #服务启动端口
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848


分别配置服务启动端口、服务名称以及注册中心nacos-server的地址


3)发布服务


创建controller类:ProviderController


@RestController
@Slf4j
public class ProviderController {

    @GetMapping("/hello")
    public String hello(){
        log.info("provider be invoked!");
        return "hello world!";
    }
}


新建服务“/hello


4)启动类


@SpringBootApplication
@EnableDiscoveryClient //开启服务发现
@EnableFeignClients //开启Feign客户端
public class ProviderStartApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderStartApplication.class,args);
    }
}


除了基本注解@SpringBootApplication以外,分别添加@EnableDiscoveryClient(开启服务发现),@EnableFeignClients( 开启Feign客户端,表示生产者的服务可以被发现,并且可以使用Feign的方式进行调用


5)启动项目,查看nacos服务列表



我们看到,服务生产者nacos_provider已成功注册在nacos-server

03.建立消费者


服务消费者的建立过程跟生产者的完全一样,我们直接看如何实现服务消费者


1) pom文件


<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.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
<!--       主要为了输出日志-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>


同生产者服务引入的依赖完全一样


2)application.yml配置文件


server:
  port: 8877spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848


与生产者的配置项完全一样,分别配置服务启动端口、服务名称以及注册中心nacos-server的地址


3)使用feign调用服务


@FeignClient(value = "nacos-provider")
public interface ProviderClient {

    @GetMapping("/hello")
     String hello();
}


使用feign调用比较简单,只需要新建一个接口,在接口上使用@

FeignClient声明一下,需要调用的是哪个服务,然后在方法里,使用Restful注解@GetMapping

4)controller


@RestController
public class ConsumerController {

    @Autowired
    ProviderClient providerClient;
    @GetMapping("/callHello")
    public String callHello(){
        String hello = providerClient.hello();
        return "invoker provider :hello() ,result"+hello;
    }
}


使用@Autoried注入ProviderClient接口,并直接调用它的方法即可


5)启动类


@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerStartApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerStartApplication.class,args);
    }
}


与生产者启动类中使用的注解完全一样,此处则表明允许消费者服务进行服务发现,并且可以使用Feign进行服务远程调用


当然,消费者只要提供了可以被调用的服务,它也当然可以是生产者,反之亦然


6)启动项目,查看nacos服务列表



可以看到,nacos-consumer也已成功注册


04.消费者调用生产者


点击详情,可看到消费者的端口即为配置文件中配置的8877



访问消费者服务:http://192.168.31.95:8877/callHello


我们看到,调用成功,正常返回


那么,到目前为止,我们就分别实现了服务生产者服务消费者、以及消费者使用Feign成功调用生产者


但这样貌似并没有体现出来注册中心的价值,我们知道,生产者服务只有一个实例时,跟消费者直接调用生产者的效果是差不多的。你想啊,这样明明就可以直接调用,为什么还一定要把我们都注册到其他地方,然后再进行调用呢 ?岂不是绕弯路了?


三 进阶

多节点调用



所以,注册中心的真正价值是体现在分布式集群的场景下的


那,你想不想看看当生产者有两个节点的情况,它是如何调用的?


继续,follow me~


1)配置多节点服务


首先,大家应该注意到了,nacos-provider的配置文件中的端口配置:


server:
  port: ${port:8860} #服务启动端口


使用${}的方式进行配置。这种格式表示,若启动时指定了端口,则以指定的端口启动,否则就以8860端口启动


那么我们只需要在每次启动时分别配置不同端口,就可以实现启动N个

服务,在IDEA中的话,我们可以通过以下方式进行配置



2)分别启动服务




3)查看管理端变化


启动以后,查看管理端




你会发现此时,nacos-provider的实例数变成了2,并且服务详情页面里面,显示了两个实例的具体信息


这个时候,再次使用消费者进行调用,由于负载均衡算法默认是轮询方式,因此我们可以通过日志看到,两个生产者服务时轮流被调用


四 总结

总而言之


关于Nacos,今天就先聊到这里,可能你会觉得 特别简单。是的,技术本来就是发展得越来越简单的,上次看到一个段子,说程序员现在每天的生活可轻松了,要实现个什么东西,网上直接找到一段代码,改吧改吧就好了,写代码还有好多自动补全,异常提醒等方便的辅助工具......

哈哈,可能稍微有些许夸张,但确实有一定的道理啊,技术虽然革新比较快,但是网上的学习资料也越来越多,我们学习的途径也越来越多,当然,在同样的条件下,我们要是停止了学习的步伐,那么可能就要落后喽~


看完本节,你一定在掌握了:


1、什么是Nacos,如何实现Nacos注册中心

2、如何实现Nacos客户端

3、如何在IDEA中实现多模块项目

4、如何实现feign的远程调用

5、消费者如何实现多实例服务调用


嗯,就这样。每天学习一点,时间会见证你的强大~


下期预告:


Spring Cloud(六):注册中心nacos-站在客户端角度

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表