专栏首页生如夏花的个人博客微服务系列(二)-nacos服务发现

微服务系列(二)-nacos服务发现

Nacos服务发现

Nacos简介

服务发现产品对比

目前市面上用的比较多的服务发现中心有:Nacos、Eureka、Consul和Zookeeper。

对比项目

Naos

Eureka

Consul

Zookeeper

一致性协议

支持AP和CP模型

AP模型

CP模型

CP模型

健康检查

TCP/HTTP/MYSQL/Client Beat

Client Beat

TCP/HTTP/gRPC/Cmd

Keep Alive

负载均衡策略

权重/metadata/Selector

Ribbon

Fabio

-

雪崩保护

自动注销实例

支持

支持

不支持

支持

访问协议

HTTP/DNS

HTTP

HTTP/DNS

TCP

监听支持

支持

支持

支持

支持

多数据中心

支持

支持

支持

不支持

跨注册中心同步

支持

不支持

支持

不支持

SpringCloud集成

支持

支持

支持

不支持

Dubbo集成

支持

不支持

不支持

支持

k8s集成

支持

不支持

支持

不支持

Nacos简介

Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。 官方是这样说的:

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务 发现、服务配置管理、服务及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构的服务基础设施。

官方地址

Nacos特性

Nacos主要提供以下四大功能: 1.服务发现与服务健康检查 Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防 止向不健康的主机或服务实例发送请求。 2.动态配置管理 动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新 部署应用程序,这使配置的更改更加高效和灵活。 3.动态DNS服务 Nacos提供基于DNS 协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以 域名的方式暴露端点,让三方应用方便的查阅及发现。 4. 服务和元数据管理 Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周 期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。 这里1、3、4说明了服务发现的功能特性。

安装Nacos Server
环境准备

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在 以下版本环境中安装使用: 1 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。 2. 64 bit JDK 1.8+; 3. 3. Maven 3.2.x+;

下载源码或者安装包

你可以通过源码和发行包两种方式来获取Nacos 从Github上下载源码方式

git clone https://github.com/alibaba/nacos.git cd nacos/ mvn ‐Prelease‐nacos clean install ‐U ls ‐al distribution/target/ // change the v e r s i o n t o y o u r a c t u a l p a t h c d d i s t r i b u t i o n / t a r g e t / n a c o s ‐ s e r v e r ‐ version to your actual path cd distribution/target/nacos‐server‐ versiontoyouractualpathcddistribution/target/nacos‐server‐version/nacos/bin

下载编译后压缩包方式 最新稳定版本 下载后解压

unzip nacos‐server‐ v e r s i o n . z i p 或 者 t a r ‐ x v f n a c o s ‐ s e r v e r ‐ version.zip 或者 tar ‐xvf nacos‐server‐ version.zip或者tar‐xvfnacos‐server‐version.tar.gz cd nacos/bin

启动服务器 nacos的默认端口是8848,需要保证8848默认端口没有被其他进程占用 进入安装程序的bin目录 Linux/Unix/Mac启动方式: 启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

Windows启动方式: 启动命令

cmd startup.cmd

或者双击startup.cmd运行文件。

启动成功,可通过浏览器访问 http://127.0.0.1:8848/nacos nacos控制台界面 默认用户名:nacos,默认密码:nacos

外部数据库支持

单机模式时nacos默认使用嵌入式数据库实现数据的存储,若想使用外部mysql存储nacos数据,需要进行以下步 骤: 1.安装数据库,版本要求:5.6.5+ ,mysql 8 以下 (在nacos1.4版本及以上已经支持到mysql8.0.16) 2.初始化mysql数据库,新建数据库nacos_config,数据库初始化文件: n a c o s h o m e / c o n f / n a c o s − m y s q l . s q l 3. 修 改 {nacoshome}/conf/nacos- mysql.sql 3.修改 nacoshome/conf/nacos−mysql.sql3.修改{nacoshome}/conf/application.properties文件,增加支持mysql数据源配置(目前只支持 mysql),添加mysql数据源的url、用户名和密码。

spring.datasource.platform=mysql 
db.num=1 
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true 
db.user=nacos_devtest 
db.password=youdontknow

RESTful服务发现

测试环境

通过Spring Cloud Alibaba实现解决: 1、服务发现客户端从服务发现中心获取服务列表 2、服务消费方通过负载均衡获取服务地址

在nacos-discovery父工程中添加依赖管理

<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>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>

            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

分别在服务提供及服务消费工程中添加依赖,此依赖的作用是服务发现

 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  </dependency>
服务注册

在服务提供工程中配置nacos服务发现相关的配置:

spring:
  application:
    name: nacos‐restful‐provider
  cloud:
    nacos:
      discovery:
        server-addr: 172.16.27.3:8848

启动nacos 启动服务提供 观察nacos服务列表, nacos-restful-provider注册成功

服务发现

在服务消费工程中配置nacos服务发现相关的配置 服务消费

#配置服务提供方的地址
provider:
  address: 127.0.0.1:56010

spring:
  application:
    name: nacos-restful-consumer #服务名
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #服务发现中心地址

Controll中远程调用的代码

@RestController
public class RestConsumerController {


    //指定服务名
    String serviceId = "nacos-restful-provider";

    @Autowired
    LoadBalancerClient loadBalancerClient;


    @GetMapping("/service")
    public String service(){
        //远程调用
        RestTemplate template = new RestTemplate();

        ServiceInstance choose = loadBalancerClient.choose(serviceId);
        URI uri = choose.getUri();
        String result = template.getForObject(uri+"/service",String.class);
        return "消费了"+result;
    }
}

执行流程 1.服务方将自己注册到服务注册中心 2.服务消费方从注册中心获取服务地址 3.进行远程调用

负载均衡

在RESTful服务发现的流程中,ServiceA通过负载均衡调用ServiceB 负载均衡就是将用户请求(流量)通过一定的策略,分摊在多个服务实例上执行,它是系统处理高并发、缓解网络 压力和进行服务端扩容的重要手段之一。它分为服务端负载均衡和客户端负载均衡。 服务器端负载均衡:

在负载均衡器中维护一个可用的服务实例清单,当客户端请求来临时,负载均衡服务器按照某种配置好的规则(负载均衡算法)从可用服务实例清单中选取其一去处理客户端的请求。这就是服务端负载均衡。

例如Nginx,通过Nginx进行负载均衡,客户端发送请求至Nginx,Nginx通过负载均衡算法,在多个服务器 之间选择一个进行访问。即在服务器端再进行负载均衡算法分配。

客户端服务负载均衡:

上边使用的LoadBalancerClient就是一个客户端负载均衡器,具体使用的是Ribbon客户端负载均衡器。 Ribbon在发送请求前通过负载均衡算法选择一个服务实例,然后进行访问,这是客户端负载均衡。即在客户 端就进行负载均衡的分配。

Ribbon是一个客户端负载均衡器,它的责任是从一组实例列表中挑选合适的实例,如何挑选?取决于负载均衡策略

Ribbon核心组件IRule是负载均衡策略接口 RoundRobinRule(默认):轮询,即按一定的顺序轮换获取实例的地址。 RandomRule:随机,即以随机的方式获取实例的地址。 AvailabilityFilteringRule: 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,以及并发的连接数量 超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问; WeightedResponseTimeRule: 根据平均响应时间计算所有服务的权重,响应时间越快,服务权重越大,被选中的 机率越高; 刚启动时,如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够时,会切换到 WeightedResponseTimeRule RetryRule: 先按照RoundRobinRule的策略获取服务,如果获取服务失败,则在指定时间内会进行重试,获取可用 的服务; BestAvailableRule: 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的 服务; ZoneAvoidanceRule: 默认规则,复合判断server所在区域的性能和server的可用性选择服务器;

修改负载均衡策略

nacos‐restful‐provider: 
	ribbon: 
		NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微服务系列(一)-服务发现

    在微服务架构中,整个系统会按职责能力划分为多个服务,通过服务之间协作来实现业务目标。这样在我们的代码 中免不了要进行服务间的远程调用,服务的消费方要调用服务的生...

    许喜朝
  • 微服务系列(四):服务发现模型

    命名空间(Namespace)用于进行租户粒度的隔离,Namespace 的常用场景之一是不同环境的隔离,例如开发测试 环境和生产环境的资源(如配置、服务)隔离...

    许喜朝
  • 工厂设计模式

    定义一个用于创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使得一个类的实例化延迟到子类

    许喜朝
  • 康过来!Nacos配置和管理微服务的使用

    2、解压下载的压缩包,解压之后的文件我自己直接启动的时候是会报错的(环境变量需要先配置好)

    用户5546570
  • 没有Eureka,但多了Nacos

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

    battcn
  • Windows10 Oracle ODBC安装配置

    架构师专栏
  • SEO的基本概念

    seo是英文SearchEngineOptimization的缩写,中文意思是“搜索引擎优化”搜索引擎优化。

    大金SEO
  • 如何在 IIS 上搭建 mercurial server

    mercurial server 对于代码管理工具,更多的人可能更熟悉 Git 一些(Git 太火了)。其实另外一款分布式代码管理工具也被广泛的使用,它就是 m...

    葡萄城控件
  • PaddlePaddle 版本1.1.0发布啦!

    PaddlePaddle在基础框架、模型建设、分布式训练、预测引擎各个方向上完成多项更新。OP进行了全面完善和优化,模型库新增了自然语言处理、视觉和推荐等领域的...

    用户1386409
  • Hadoop离线数据分析平台实战——470地域信息数据展示Hadoop离线数据分析平台实战——470地域信息数据展示

    Hadoop离线数据分析平台实战——470地域信息数据展示 项目进度 模块名称 完成情况 1. 程序后台框架搭建 完成 2. 用户基本信息展示...

    Albert陈凯

扫码关注云+社区

领取腾讯云代金券