您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

一文看懂微服务架构之注册中心Consul、Nacos

时间:2020-11-13 09:53:19  来源:  作者:

思维导图

一文看懂微服务架构之注册中心Consul、Nacos

 

文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary

一、前言

伴随着Eurka2.0版本已停止维护,开始要考虑使用微服务新一代的开源的注册中心替代Eureka。

一文看懂微服务架构之注册中心Consul、Nacos

 

目前据我了解,Consul和Nacos是比较流行的两种替代方案。这篇文章就介绍一下这两种注册中心在微服务中的简单使用,希望对读者有所帮助。

二、注册中心的作用

注册中心在微服务的架构中相当于一个“服务的通讯录”。当一个服务启动时,需要向注册中心注册服务,注册中心保存了所有服务的服务名称和服务地址的映射关系。当服务A想调用服务D时,则从注册中心获取服务D的服务地址,然后调用。

我画张图给大家描述会更清楚一点,大概如下:

一文看懂微服务架构之注册中心Consul、Nacos

 

可能会有人问,为什么不直接通过服务地址调用服务D呢,还要从注册中心去获取服务D的服务地址。因为一个服务背后是不止一台机器的,比如服务D可能在实际生产中是由三台机器支持的,对外只暴露一个服务名称,这样可以避免写死服务的IP地址在代码中(写在配置文件里),在服务扩展时就非常方便了。

除了服务注册之外,注册中心还提供服务订阅,当有新的服务注册时,注册中心会实时推送到各个服务。

还有服务健康监测,可以在管理界面看到注册中心中的服务的状态。

三、Consul

Go语言开发,支持多数据中心分布式高可用的服务发布和服务注册,采用ralt算法保证服务的一致性,且支持健康检查。

3.1 安装(win10版)

第一步,上官网下载安装包。

一文看懂微服务架构之注册中心Consul、Nacos

 

第二步,解压zip包,并配置环境变量。

一文看懂微服务架构之注册中心Consul、Nacos

 


一文看懂微服务架构之注册中心Consul、Nacos

 

第三步,唱跳rap篮球键ctrl+R,cmd,输入命令consul:

一文看懂微服务架构之注册中心Consul、Nacos

 

这就安装成功了,超简单!输入consul -version验证一下,会显示版本号:

一文看懂微服务架构之注册中心Consul、Nacos

 

第四步,启动。输入命令consul.exe agent -dev本地启动:

一文看懂微服务架构之注册中心Consul、Nacos

 

第五步,在浏览器中输入http://localhost:8500打开管理界面。

一文看懂微服务架构之注册中心Consul、Nacos

 

3.2 服务注册

接下来就需要创建两个服务,分别是订单(order)和用户(user),注册到consul。下面我就演示其中一个user服务。

首先创建一个SpringBoot工程,Maven配置如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>
<groupId>io.github.yehongzhi</groupId>
<artifactId>user</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency><!-- 健康监测的包 -->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency><!-- spring-cloud-consul服务治理的jar包 -->
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        <version>2.0.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

然后yml配置文件如下:

server:
  port: 8601
spring:
  Application:
    name: user
  cloud:
    consul:
      port: 8500
      host: 127.0.0.1
      discovery:
        service-name: user
        instance-id: ${spring.application.name}:${spring.cloud.consul.host}:${server.port}
        health-check-path: /actuator/health
        health-check-interval: 10s
        prefer-ip-address: true
        heartbeat:
          enabled: true

在启动类加上开启服务注册的注解:

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

}

最后启动项目即可,我这里启动两个user,端口号分别是8601,8602:

一文看懂微服务架构之注册中心Consul、Nacos

 

3.3 服务调用

再创建一个订单项目(order),和user配置类似,注册服务到consul中。

一文看懂微服务架构之注册中心Consul、Nacos

 

下面演示一下用order服务调用user服务,首先定义user的接口:

@RestController
@RequestMapping("/mall/user")
public class UserController {
    @RequestMapping("/list")
    public Map<String, Object> list() throws Exception {
        Map<String, Object> userMap = new HashMap<>();
        userMap.put("1号佳丽", "李嘉欣");
        userMap.put("2号佳丽", "袁咏仪");
        userMap.put("3号佳丽", "张敏");
        userMap.put("4号佳丽", "张曼玉");
        return userMap;
    }
}

接着在order服务调用user服务,使用RestTemplate的方式:

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

    @Resource
    private LoadBalancerClient loadBalancerClient;

    @RequestMapping("/callUser")
    public String list() throws Exception {
        //从注册中心中获取user服务实例,包括服务的IP,端口号等信息
        ServiceInstance instance = loadBalancerClient.choose("user");
        //调用user服务
        String userList = new RestTemplate().getForObject(instance.getUri().toString() + "/mall/user/list", String.class);
        return "调用" + instance.getServiceId() + "服务,端口号:" + instance.getPort() + ",返回结果:" + userList;
    }
}

启动两个user服务,一个order服务,调用order的接口,可以看到结果:

一文看懂微服务架构之注册中心Consul、Nacos

 


一文看懂微服务架构之注册中心Consul、Nacos

 

负载均衡默认是轮询访问,所以交替调用8601和8602的user服务。

consul的简单入门就讲到这里了,除了服务治理之外,consul还可以用于做配置中心,读者有兴趣可以自己探索一下。我这里用的是dev模式,相当于单机模式,仅用于学习,实际生产的话肯定是集群模式,后面如果有时间我再专门写一篇演示一下consul集群的搭建。

下面讲另一款注册中心,阿里出品的Nacos。

四、Nacos

以下介绍来源于官网:

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

总结就是,Nacos提供三种功能:服务发现及管理、动态配置服务、动态DNS服务。

我这里主要讲服务发现,也就是作为注册中心的功能。

4.1 安装

首先下载安装包,目前稳定版是1.3.1,推荐在linux或者mac系统上使用,我懒得开虚拟机,所以我就直接在win系统安装。

一文看懂微服务架构之注册中心Consul、Nacos

 

我这里仅用于学习,使用单机模式,官网上介绍,双击startup.cmd文件启动即可。

一文看懂微服务架构之注册中心Consul、Nacos

 

实际上,会报错。

一文看懂微服务架构之注册中心Consul、Nacos

 

这个错误,我发现github上有人提出来,再后面加个参数就可以了。

一文看懂微服务架构之注册中心Consul、Nacos

 

但是又有人说后面的版本已经优化了,没有这个错误。反正如果遇到的话,就加个参数启动吧。完整命令是startup.cmd -m standalone。

如果不想在启动命令后面加参数,可以配置MySQL(版本要求:5.6.5+),初始化mysql数据库,数据库初始化文件:nacos-mysql.sql。

一文看懂微服务架构之注册中心Consul、Nacos

 

修改conf/application.properties文件配置:

db.num=1
db.url.0=jdbc:mysql://数据库地址:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=账号
db.password=密码

启动成功,命令行窗口可以看到以下提示:

一文看懂微服务架构之注册中心Consul、Nacos

 

启动成功后,可以在浏览器打开http://localhost:8848/nacos/,进入管理界面。账号密码默认都是nacos。

一文看懂微服务架构之注册中心Consul、Nacos

 


一文看懂微服务架构之注册中心Consul、Nacos

 

4.2 服务注册

接下来还是一样,创建两个服务注册到nacos,为了跟前面的区分,项目名后缀加上"nacos"。首先添加maven配置,如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
    <dependencies>
  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.SR1</version>
            <type>pom</type>
            <scope>import</scope>
     </dependency>
     <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.2.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency><!-- SpringWeb依赖 -->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency><!-- SpringCloud nacos服务发现的依赖 -->
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

启动类加上注解@EnableDiscoveryClient。

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

配置文件application.properties文件加上配置。

server.port=8070
spring.application.name=usernacos
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

创建一个UserController接口,提供给其他微服务调用。

@RestController
@RequestMapping("/mall/userNacos")
public class UserController {
    @RequestMapping("/list")
    public Map<String, Object> list() {
        Map<String, Object> userMap = new HashMap<>();
        userMap.put("周杰伦", "爱在西元前");
        userMap.put("张学友", "只想一生跟你走");
        userMap.put("刘德华", "忘情水");
        userMap.put("陈奕迅", "K歌之王");
        userMap.put("卫兰", "就算世界没有童话");
        return userMap;
    }
}

运行启动类的main方法,可以看到注册中心多了一个usernacos服务。

一文看懂微服务架构之注册中心Consul、Nacos

 

4.3 服务调用

相同的配置和方法,再创建一个ordernacos服务,作为消费者。

@RestController
@RequestMapping("/mall/orderNacos")
public class OrderController {
    @Resource
    private LoadBalancerClient loadBalancerClient;

    @RequestMapping("/callUser")
    public String callUser() {
        ServiceInstance instance = loadBalancerClient.choose("usernacos");
        String url = instance.getUri().toString() + "/mall/userNacos/list";
        RestTemplate restTemplate = new RestTemplate();
        //调用usernacos服务
        String result = restTemplate.getForObject(url, String.class);
        return "调用" + instance.getServiceId() + "服务,端口号:" + instance.getPort() + ",返回结果:" + result;
    }
}

启动2个usernacos服务,1个ordernacos服务。

一文看懂微服务架构之注册中心Consul、Nacos

 

测试接口http://localhost:8170/mall/orderNacos/callUser,order能顺利调用user,默认负载均衡策略也是轮询机制。

一文看懂微服务架构之注册中心Consul、Nacos

 


一文看懂微服务架构之注册中心Consul、Nacos

 

五、总结

国内用的比较多的是Nacos,我觉得原因有几点:

  • 因为阿里目前用的就是Nacos,经历过双十一,各种秒杀活动等高并发场景的验证。
  • 文档比较齐全,关键有中文文档,对于国内很多英文水平不是很好的开发者看起来真的很爽。
  • 很多从阿里出来的程序员,把阿里的技术带到了各个中小型互联网公司,一般技术选型肯定选自己熟悉的嘛。
  • 管理界面有中(英)文版本,易于操作。
  • 还有社区比较活跃,很多问题可以在网上找到解决方案。

这篇文章主要介绍了SpringCloud微服务关于注册中心的两种流行的实现方案,接下来还会继续介绍其他关于微服务的组件,敬请期待。

上面所有例子的代码都上传Github了:

https://github.com/yehongzhi/mall

觉得有用就点个赞吧,你的点赞是我创作的最大动力~

拒绝做一条咸鱼,我是一个努力让大家记住的程序员。我们下期再见!!!

能力有限,如果有什么错误或者不当之处,请大家批评指正,一起学习交流!



Tags:微服务架构   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言要理解微服务,首先要先理解不是微服务的那些。通常跟微服务相对的是单体应用,即将所有功能都打包成在一个独立单元的应用程序。从单体应用到微服务并不是一蹴而就的,这是一...【详细内容】
2021-07-09  Tags: 微服务架构  点击:(112)  评论:(0)  加入收藏
一、Zuul简介Zuul相当于是第三方调用和服务提供方之间的防护门,其中最大的亮点就是可动态发布过滤器二、Zuul可以为我们提供什么1、权限控制2、预警和监控3、红绿部署、(粘...【详细内容】
2021-04-21  Tags: 微服务架构  点击:(229)  评论:(0)  加入收藏
前不久作为架构师完成了某知名快消企业的一个业务中台建设。系统上线后,经历了双十一活动的流量高峰,整体运行稳定。最近有空,便将此次架构的思路,心得稍作整理在这篇博客中分享...【详细内容】
2021-02-07  Tags: 微服务架构  点击:(181)  评论:(0)  加入收藏
文章简介:作者结合自身微服务架构研发经验进行回顾、总结,本文将介绍微服务架构中,在技术选型时需要注意哪些选型原则,会遇到哪些开源框架,又该如何选择, 进行了全面的归纳、对比,希望能够为大家提供一些思路、方向,少走一些...【详细内容】
2021-02-05  Tags: 微服务架构  点击:(160)  评论:(0)  加入收藏
思维导图 文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary一、前言伴随着Eurka2.0版本已停止维护,开始要考虑使用微服务新一代的开源的注册中心...【详细内容】
2020-11-13  Tags: 微服务架构  点击:(159)  评论:(0)  加入收藏
消息总线的定义前面在1.4.2节中强调过,在微服务架构中,经常会使用REST 服务或基于消息的通信机制。在3.6节中也详细介绍了消息通信的实现方式。消息总线就是一种基于消息的通...【详细内容】
2020-09-29  Tags: 微服务架构  点击:(140)  评论:(0)  加入收藏
微服务的高级主题一自动扩展Spring Cloud 提供了大规模部署微服务所必需的支持。为了获得像云服务环境一样的能力, 微服务实例也应该能够根据流量的规模来自动扩展,也称自动缩...【详细内容】
2020-09-23  Tags: 微服务架构  点击:(96)  评论:(0)  加入收藏
Spring Cloud 微服务总体架构图Spring cloud作为当下主流的微服务框架,让我们实现微服务架构简单快捷,Spring cloud中各个组件在微服务架构中扮演的角色如图所示。spring-cl...【详细内容】
2020-09-20  Tags: 微服务架构  点击:(133)  评论:(0)  加入收藏
常见微服务的消费者本节就常见的微服务的消费者进行介绍。在Java领域比较常用的消费者框架主要有HttpClient、Ribbon、Feign 等。 Apache HttpClientApache HttpClient是Apa...【详细内容】
2020-09-11  Tags: 微服务架构  点击:(129)  评论:(0)  加入收藏
什么是微服务模式随着网络基础设施的高速发展,以及越来越多的个体接入互联网,在考虑构建支持海量请求以及多变业务的软件平台时,微服务架构成为多数人的首选。微服务架构的出现...【详细内容】
2020-09-09  Tags: 微服务架构  点击:(95)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(3)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(8)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(20)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(16)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(16)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条