一、服务调用关系

服务提供者:暴露接口给其他微服务调用服务消费者:调用其他微服务提供的接口提供者与消费者角色其实是相对的一个服务可以同时是服务提供者和服务消费者

二、Eureka注册中心

1、通过Eureka的一次远程服务调用的过程

服务提供者注册服务信息(通常所有微服务都要注册,包括Eureka自己),每个微服务的服务器需要向注册中心进行心跳续约,没30秒1次服务消费者拉取服务提供者的消息负载均衡调用服务提供者的服务器服务消费者远程调用服务提供者的微服务

2、Eureka的作用

消费者该如何获取服务提供者具体信息?

服务提供者启动时向Eureka注册自己的信息Eureka保存这些信息消费者根据服务名称向eureka拉取提供者信息 如果有多个服务提供者,消费者该如何选择?

服务消费者利用负载均衡算法,从服务列表中挑选一个 消费者如何感知服务提供者健康状态?

服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态Eureka会更新记录服务列表信息,心跳不正常会被剔除消费者就可以拉取到最新的信息

3、在Eureka架构中,微服务角色有两类:

EurekaServer:服务端,注册中心

记录服务信息心跳监控 EurekaClient:客户端

Provider:服务提供者

注册自己的信息到EurekaServer每隔30秒向EurekaServer发送心跳 Consumer:服务消费者

根据服务名称从EurekaServer拉取服务列表基于服务列表做负载均衡,选择一个微服务后发起远程调用

三、搭建EurekaServer服务

1、搭建EurekaServer服务步骤:

创建eurea-server项目,引入依赖

org.springframework.cloud

spring-cloud-starter-netflix-eureka-server

编写启动类,添加@EnableEurekaServer注解

@EnableEurekaServer

@SpringBootApplication

public class EurekaApplication {

public static void main(String[] args) {

SpringApplication.run(EurekaApplication.class, args);

}

}

添加application.yml文件,编写以下配置

server:

port: 10086 # 服务端口

spring:

application:

name: eurekaserver # eureka的服务名称

eureka:

client:

# register-with-eureka: true #false表示不向注册中心注册自己。

# fetch-registry: true #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务

service-url: # eureka的地址信息

defaultZone: http://127.0.0.1:10086/eureka

2、模拟多实例部署

在Service窗口对需要多实例的应用右键点击复制配置修改名字,并在VM选项中输入-Dserver.port=8082(随便填写一个端口号)

3、服务注册

引入eureka-client依赖

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

在application.yml中配置eureka地址

eureka:

client:

service-url: # eureka的地址信息

defaultZone: http://127.0.0.1:10086/eureka

4、服务消费者完成服务拉取

修改服务消费者的代码,修改访问的url路径,用服务名代替ip、端口

String url = "http://userservice/user/" + order.getUserId();

在服务消费者项目的启动类中的RestTemplate添加负载均衡注解

@Bean

@LoadBalanced //表示被Ribbon拦截,并进行负载均衡处理

public RestTemplate restTemplate() {

return new RestTemplate();

}

四、Ribbon负载均衡流程

五、负载均衡策略

1、Ribbon的负载均衡规则是一个叫做IRule的接口来定义的,每一个子接口都是一种规则;默认规则是ZoneAvoidanceRule,即在一个Zone内进行轮询访问

2、通过定义IRule实现可以修改负载均衡规则

添加代码方式,在服务消费者的启动类中定义一个新的IRule好处是配置灵活,可以全局配置,但修改时需要重新打包发布

@Bean

public IRule randomRule() {

return new RandomRule();

}

配置文件方式,在服务消费者的application.yml文件中添加新的配置好处是直观,方便,无须重新打包发布,但无法做到全局配置,只能指定微服务实现

userservice: #这里是服务提供者的名称

ribbon:

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则,随机访问

六、饥饿加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载

ribbon:

eager-load:

enabled: true # 开启饥饿加载

clients: # 指定饥饿加载的服务名称,如果只有一个微服务,也可以直接写在上面

- userservice # 如果写在下面,则要加个-,后续如果要添加其他微服务,继续加即可

七、Nacos注册中心

1、Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高

2、将微服务注册到Nacos

在所有微服务的父工程中添加spring-cloud-alilibaba的管理依赖

com.alibaba.cloud

spring-cloud-alibaba-dependencies

2.2.5.RELEASE

pom

import

添加nacos的客户端依赖

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

修改所有微服务的application.yml文件,添加nacos地址

spring:

cloud:

nacos:

server-addr: nacos:8849 # nacos服务地址

在下载好的nacos中bin文件夹的地址栏上,输入cmd进入当前目录下的cmd窗口,输入startup.cmd -m standalone启动nacos服务,在浏览器中输入http://169.254.219.198:8849/nacos/index.html进入nacos管理界面

八、Nacos服务分级存储模型

将微服务以特征划分集群,比如在杭州、北京的服务器各自划分一个集群;服务调用尽可能选择本地集群的服务,跨集群调用延迟较高;本地集群不可访问时,再去访问其他集群一级是服务,例如userservice二级是集群,例如杭州或上海三级是实例,例如杭州机房的某台部署了userservice的服务器

2、设置服务集群属性:修改application.yml文件

spring:

cloud:

nacos:

server-addr: nacos:8849 # nacos服务地址

discovery:

cluster-name: HZ #配置集群名称,HZ代码杭州

九、NacosRule负载均衡策略

NacoosRule会优先选择同集群服务实例列表,如果本地集群找不到,才会去其他集群寻找,并且会报警告,当确定了可用实例列表后,再采用随机负载均衡挑选实例配置策略:修改微服务的application.yml配置文件,和Eureka的负载均衡策略一样

userservice:

ribbon:

NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则,在集群内部采用随机访问,如果本地没有,则会进行跨集群访问

根据权重负载均衡:Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高

在Nacos控制台中可以设置实例的权重值,0~1之间当权重设置为0时则该实例完全不会被访问

十、环境隔离

Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离在Nacos控制台中可以创建namespace,用来隔离不同环境将生成的namespace的ID添加到实例的application.yml文件中即可完成隔离不同namespace下的实例无法相互访问

spring:

cloud:

nacos:

server-addr: nacos:8849 # nacos服务地址

discovery:

cluster-name: HZ #集群名称

namespace: 014035c1-8176-4b5e-9423-0e85c6d2cd41 # dev环境,即命名空间的ID

ephemeral: false # 是否是临时实例

十一、Nacos与Eureka的比较

1、共同点:

都支持服务注册和服务拉取都支持服务提供者心跳方式做健康检测

2、不同点

Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式临时实例心跳不正常会被剔除,非临时实例则不会被剔除,等正常后就会恢复Nacos支持服务列表变更的消息推送模式,服务列表更新更及时Nacos集群默认优先保证AP方式,当集群中存在非临时实例时,优先保证CP;Eureka优先保证AP

3、修改非临时实例的方法,即修改实例的application.yml文件

spring:

cloud:

nacos:

server-addr: nacos:8849 # nacos服务地址

discovery:

ephemeral: false # 是否是临时实例,默认是true

十二、Nacos配置管理

配置获取的步骤,优先读取nacos中的配置并覆盖掉applicatino.yml文件中相同的配置 统一配置管理的步骤在Nacos中添加配置文件,手动填写当前环境、服务名称、文件后缀名,以及配置文件里面的详细信息在微服务中引入Nacos的配置管理客户端依赖:

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-config

在微服务的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml,通过这个文件获取nacos服务器的信息,并决定nacos读取哪个配置文件

spring:

application:

name: userservice

profiles:

active: dev # 环境

cloud:

nacos:

server-addr: localhost:8849 # nacos地址

config:

file-extension: yaml # 文件后缀名

十三、Nacos配置自动更新

Nacos中的配置文件变更后,微服务无需重启就可以感知方法一:在@Value注入的变量所在类上添加注解@RefreshScope

@Slf4j

@RestController

@RequestMapping("/user")

@RefreshScope

public class UserController {

@Value("${pattern.dateformat}")

private String dateformat;

...

}

方法二:使用ConfigurationProperties注释

@Data

@Component

@ConfigurationProperties(prefix = "pattern") //这里通过约定大于配置的方式自动根据配置属性名匹配

public class PatternProperties {

private String dateformat;

private String envSharedValue;

private String name;

}

注意:不是所有的配置都适合放到配置中心,维护起来比较麻烦;建议将一般关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置

十四、Nacos多种配置的优先级

最高:[服务名]-[spring.profile.active].yaml,环境配置其次:[服务名].yaml,默认配置,多环境共享最低:application.yml,本地配置

十五、Nacos集群搭建步骤

搭建MySQL集群并初始化数据库表下载解压nacos修改集群配置(节点信息)、数据库配置分别启动多个nacos节点nginx反向代理

推荐阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: