一位爱好技术的橘右京的哥哥橘左京
这里写目录标题
1.服务发现
1.1 什么是服务发现
在微服务架构中,整个系统会被划分为多个微服务,微服务与微服务之间进行协作实现目标,这样代码中就要进行远程调用(服务消费方调用服务生产方),消费方需要知道服务方的网络位置(IP、端口号)。
1.2 主流服务发现与配置中心对比
1.3 SpringCloud服务协作流程
服务B将信息注册到服务发现中心,服务A获取B的注册信息,通过Ribbon进行负载均衡算法选择某一服务,选择某一服务后通过Fegin调用该服务的API完成服务协作。
1.3.1 负载均衡的概念
负载均衡就是用户发送请求后通过一定的策略,将压力分摊到多个实例之间,用于处理高并发、缓解服务器压力和减小网络压力的重要手段之一,它分为服务端负载均衡、客户端负载均衡。
服务端负载均衡是用户请求服务的时候会先经过负载均衡器(如:Nginx),由负载均衡器进行请求的分配,从而实现高可用。
客户端负载均衡是用户请求服务的时候通过负载均衡算法去服务注册表里选择一个实例来进行调用实现高可用。
Ribbon是一个客户端负载均衡器,它的责任是从一组实例列表中挑选合适的实例,如何挑选这就取决于负载均衡。
Ribbon核心组件IRule是负载均衡策略接口,它有如下实现:
· RoundRolbinRule(默认):轮询,既按一定的顺序轮换获取实例的地址
· RandomRule(随机):随机的形式获取实例的地址
· AvalibailityFilteringRule:会过滤到多次访问故障而处于断路器跳闸状态的服务,以及并发数量超过阈值的服务,然后对剩余的服务进行轮询的操作。
· WeightedResponseTimeRule:根据平均响应时间进行选择服务,平均响应时间越短被选中的几率越高。
若刚启动,并无平均响应时间数据会自动切换轮询,等数据足够后会自动切换回当前均衡方式。
· RetyRule:先按照RoundRobinRule的策略获取服务,如果服务获取失败,则在指定时间内重试获取可用的服务。
· BestAvalibableRule:会过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量很小的服务。
·ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器。
SpringBoot配置文件修改默认负载均衡策略:
account-service.ribbon.NFloadBalancerRuleClassName=com.netfix.loadbalancer.RandomRule
account-service是服务调用的名称,后面的是组成部分是固定的
2.搭建Nacos服务
模拟:我们搭建一个微服务项目,通过nacos将信息注册到配置中心,通过Fegin完成服务与服务的远程调用。
2.1 配置Nacos
1)下载Nacos https://nacos.io/zh-cn/docs/quick-start.html
2)解压Nacos 打开 /conf/application.properties文件
3)可增加数据库配置,将配置信息存放数据库
Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/demo-nacos?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=root
4)nacos默认端口号8848 也可进行更改
server.port=8849
5)启动Nacos
2.2 搭建服务生产者
**1)新建项目
2)新建服务生产者模块
3)父类pom.xml 导入依赖**
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!-- feign客户端依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>test</scope>
</dependency>
<!--Nacos-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
4)新建启动类
@SpringBootApplication : 是Sprnig Boot项目的核心注解,目的是开启自动配置
@EnableDiscoveryClient:启用Nacos
**5)新建controller
6)新建配置文件 输入配置信息**
server:
port: 8010
spring:
application:
name: pro-nacos
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8849
7)启动服务
nacos服务列表中已经出现了刚刚注册的服务
2.3 配置消费者
1)新建消费者模块
2)新建启动类
因为Fegin接口写在了这个模块内,所以要加一个@EnableFeginClients
3)新建client接口
@FeginClient(“提供者服务名称”)
4)启动服务
打开Nacos客户端后发现两个服务都已经成功注册到了Nacos
5)测试
调用成功
2.4 实现生产者复杂均衡
1)在上述文章中我们实现了生产者的nacos服务发现及Fegin远程调用,现在来实现一下生产者的负载均衡。众所周知,在Ribbon的负载均衡中默认采用的是轮询,我们就以轮询进行演示。
2)将生产者的端口号在配置文件中改为自动获取动态端口号,这样我们可以配置两个不同端口号的服务实现轮询。
3)根据步骤操作:
①第一步点击右上角新建一个生产者服务
②选择+号
③选择SpringBoot
④选择MainClass,选择对应的生产者服务
⑤定义一个端口号 -Dport=56011
4)完成配置 点击启动服务,将两个生产者服务启动后启动消费者服务,我们去Ncos中查看一下
在列表中我们发现pro-nacos的实例数为2,con-nacos的实例数为1,证明我们启动成功了两个生产者服务,一个消费者服务,这时我们使用测试工具测试一下负载均衡。
第一次服务到达了NacosProApplication1服务,输出结果”干饭人干饭魂“
第二次服务到达了NacosProApplication服务,输出结果”干饭人干饭魂“
5)至此,我们的负载均衡测试完毕,实现了Rinbbon默认的轮询方式。
3.Nacos服务发现基础应用
3.1 Nacos服务发现数据模型
命名空间(NameSpace)
用于进行租户粒度的配置隔离,命名空间不仅适用于Nacos的配置管理,同样适用于服务发现,NameSpace的常用场景之一是不同环境的配置的区分隔离,例如开发环境、测试环境、生产环境。
服务
提供给客户端的软件功能,通过预定义接口访问。
服务名
服务提供的标识,通过服务名可以确定代之的那个服务。
实例
提供一个或多个服务具有可访问网络地址的进程,启动一个服务,就产生一个服务实例。
元信息
Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签,从作用范围看,分为服务级别的元信息、集群的元信息及实例的元信息。
元信息能够让nacos更加具有扩展性,用户可以自定义数据描述实例、服务、集群等。
集群
服务实例的集合,服务实例组成一个默认集群,集群可以被进一步划分,划分的单位可以是虚拟集群,相同集群下的实例才能互相感知。
3.2 服务管理
Nacos提供了一个基本的运维界面,能够查看、编辑注册的服务,开发或运维人员通过该界面查看服务注册情况,包含当前系统注册的所有服务和每个服务的详情。
3.2.1 实例权重
在服务列表中选择服务->详情,进入界面后可调整服务的权重来分配负载的能力,值越大分配到的几率
越高。
3.2.2 上下线
可切换服务上线/下线,服务下线后负载均衡不会分配到该服务。