微服务技术一

技术栈图一、注册中心Eureka概念:搭建EurekaServer服务注册服务发现(消费者对提供者的远程调用)

二、Ribbon负载均衡负载均衡的原理:@LoadBalanced负载均衡的策略:IRule懒加载

三、Nacos注册中心Nacos的安装服务注册到NacosNacos服务分级存储模型1、配置服务集群属性2、根据集群负载均衡(NacosRule)3、根据权重负载均衡

Nacos环境隔离 - namespace修改一个服务所处的空间

临时实例与非临时实例

四、Nacos配置管理统一配置管理配置热更新配置共享搭建Nacos集群

技术栈图

微服务完整的技术栈如图: 技术栈学习:

一、注册中心Eureka

概念:

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

服务端,注册中心

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

Provider:服务提供者,例如案例中的user-service注册自己的信息到EurekaServer;每隔30秒向EurekaServer发送心跳consumer:服务消费者,例如案例中的 order-service 根据服务名称从EurekaServer拉取服务列表;基于服务列表做负载均衡,选中一个微服务后发起远程调用

什么是消费者提供者?

消费者:调用其他服务提供者:被调

A调B,B调C,B是什么角色?

B的角色要看相对于谁而言

一个服务既可以是消费者又可以是提供者

搭建EurekaServer

1、创建项目,引入 spring-cloud-starter-netflix-eureka-server 的依赖(版本依赖父工程的版本,所以没写)

org.springframework.cloud

spring-cloud-starter-netflix-eureka-server

2、在eureka-server项目编写启动类,添加 @EnableEurekaServer 注解

3、添加application.yml文件,编写配置

server:

port: 1111 # 自定义端口号

spring:

application:

name: eurekaserver # eureka的服务名称

eureka:

client:

service-url: # eureka的地址信息

defaultZone: http://localhost:1111/eureka

服务注册

1、在需要注册的项目中引入 spring-cloud-starter-netflix-eureka-client 的依赖

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

2、在application.yml文件,编写配置

spring:

application:

name: xxxservice # 服务的名称

eureka:

client:

service-url:

defaultZone: http://localhost:1111/eureka

下图是注册了两个服务,可以看到两个客户端的服务和eureka的服务都存在。 一个服务注册两个实例:

服务发现(消费者对提供者的远程调用)

【服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡】

1、修改服务的代码,修改访问的路径,用服务名代替ip、端口。下图是之前的路径写法。 修改为:String url = "http://xxxservice/user/" + …… ;

2、在yyy-service项目组的启动类中的RestTemplate添加负载均衡的注解

@Bean

@LoadBalanced //负载均衡的注解,因为上面我们对xxxservice服务创建了两个实例

public RestTemplate restTemplate() {

return new RestTemplate();

}

二、Ribbon负载均衡

负载均衡的原理:@LoadBalanced

@LoadBalanced源码分析取到的负载地址:

LoadBalancerInterceptor.java 继续 loadBalancer.execute ,进入RibbonLoadBalancerClient.java 在其内部方法中,会有IRule 规则接口,有轮询,随机等负载规则

总结如图:

负载均衡的策略:IRule

上面提到IRule接口,这里做一个简单介绍,理解一下负载规则的继承关系 可以通过定义IRule实现修改负载均衡规则,有两种方式:

1、代码方式:在消费者的启动类中,定义一个戏得IRule: @Bean

public IRule randomRule() {

return new RandomRule();

}

2、配置文件方式:在消费者的application.yml文件中,添加新的配置也可以修改规则: xxxservice: # 先指定提供者服务名称

ribbon:

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则

注意: 两种方法的作用范围是不一样的,第一种消费者所调的全体服务都是这种规则;第二种指定了提供者的服务名,是有所指的。

懒加载

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

ribbon:

eager-load:

enabled: true # 开启饥饿加载

clients: xxxservice # 指定对xxxservice 这一个服务饥饿加载

ribbon:

eager-load:

enabled: true # 开启饥饿加载

clients: # 多个服务

- xxxservice

- zzzservice

三、Nacos注册中心

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件,相比Eureka功能更加丰富。

Nacos的安装

安装包: GitHub主页:https://github.com/alibaba/nacos GitHub的Release下载页:https://github.com/alibaba/nacos/releases

windows的安装与启动很简单,可以参考自己搜索资料进行 就说一下启动的两种方式:

1 文件解压后有bin目录,中的startup.cmd双击就可以启动2 bin目录下打开cmd,输入启动命令 startup.cmd -m standalone 。

启动成功,会有带nacos的banner与网址和completed的显示信息。

http://192.168.150.1:8848/nacos/index.html 会有浏览器窗口,默认账号密码都是nacos 。

服务注册到Nacos

1、在父工程中添加spring-cloud-alibaba的管理依赖:

com.alibaba.cloud

spring-cloud-alibaba-dependencies

2.2.5.RELEASE

pom

import

2、提醒:eureka的依赖配置要删掉3、添加nacos的客户端依赖:

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

4、修改消费者与提供者服务中application.yml文件,添加nacos地址:

spring:

cloud:

nacos:

server-addr: localhost:8848 # nacos的服务地址(默认就是8848)

5、打开nacos的服务管理列表可以看到服务已经注册到nacos中。点开 “详情” 可以看到该服务的一些信息

Nacos服务分级存储模型

一级是服务,例如userservice 二级是集群,例如杭州或上海 三级是实例,例如杭州机房的某台部署了xxxservice的服务器

1、配置服务集群属性

1、修改application.yml,添加配置内容:

spring:

cloud:

nacos:

server-addr: localhost:8848

discovery:

cluster-name: HZ # 配置集群名称,即机房位置,例如:HZ,杭州

这是将提供者配置了集群属性(消费者配置同上),当消费者调用时,由于负载均衡的影响,会进行轮询的规则,找到与自己同集群服务优先使用,就要进行负载均衡的修改:

2、根据集群负载均衡(NacosRule)

1、修改yyyservice(消费者)中的application.yml,设置集群位HZ

spring:

cloud:

nacos:

server-addr: localhost:8848

discovery:

cluster-name: HZ

2、然后在yyy-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务:

yyyservice:

ribbon:

NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

3、注意将xxx-service的权重都设置为1 (在Nacos的控制台可以设置实例的权重值)

NacosRule负载均衡策略: 1、优先选择同集群服务实例 2、本地集群找不到提供者,才去其它集群寻找,并且会报警告 3、确定了可用实例列表后,在采用随机负载均衡挑选实例

3、根据权重负载均衡

1、在Nacos控制台可以设置实例的权重值,首先选中实例后面的编辑按钮2、将权重设置,会发现小于1的权重被访问到的频率大大降低

实例的权重控制: 1、Nacos控制台可以设置实例的权重值,在0~1之间 2、同集群内的多个实例,权重越高被访问的频率越高 3、权重设置为0则完全不会被访问

Nacos环境隔离 - namespace

Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离。

nacos默认有一个“public (保留空间)”。 新建命名空间的时候,命名空间ID可以不填,会随机生成。 不同namespace下的服务是不可见的

修改一个服务所处的空间

在服务的application.yml,添加namespace:

spring:

cloud:

nacos:

server-addr: localhost:8848

discovery:

cluster-name: SH # 上海

namespace: xxxxxxxxxxxxxxxx # 命名空间ID

临时实例与非临时实例

服务注册到Nacos时,可以选择注册为临时实例或非临时实例:

spring:

cloud:

nacos:

discovery:

ephemeral: false # 设置非临时实例,默认是true临时

【主动检测对服务的压力比较大,所以一般推荐临时实例】

四、Nacos配置管理

统一配置管理

1、在Nacos中添加配置文件

Data-ID:相当于配置文件名,一般不要定义为application.yml,可以使用 “服务名-环境.yaml” 。Group:分组不动就可描述:就是描述配置格式:选择 YAML配置内容:做热更新的配置

2、在某个服务的pom中引入Nacos的配置管理客户依赖:

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-config

3、在服务中的resource目录添加一个 bootstrap.yml 文件,这个文件是引导文件优先级高于application.yml: 配置nacos地址、当前环境、服务名称、文件后缀名,决定了程序启动时去nacos读取哪个文件。

spring:

application:

name: xxxservice # 服务名称

profiles:

active: dev # 开发环境,此处是dev

cloud:

nacos:

server-addr: localhost:8848 # nacos地址

config:

file-extension: yaml # 文件名后缀

注意:在原本的application.yml中关于服务名称和nacos服务的配置删掉

配置热更新

热更新:服务的配置修改,且修改后不需要重启服务,配置就能生效。

方式一:在@Value注入的变量所在类上(Controller) 添加注解@RefreshScope

方式二:使用@ConfigurationProperties注解,自动刷新

【前缀名与变量名两者拼接与配置文件一致,就能完成属性的自动配置】

配置共享

微服务启动时会从nacos读取多个配置文件:

[spring.application.name]-[spring-profiles.active].yaml,例如:xxxservice-dev.yml[spring-application.name].yaml,例如userservice.yml

无论profile如何变化,[spring-application.name].yaml文件一定会加载,因此多环境贡献配置可以写入这个文件。 【详细建议主攻一下这个环境共享】

搭建Nacos集群

搭建集群的基本步骤:

搭建数据库,初始化数据表结构下载nacos安装包配置nacos启动nacos集群nginx反向代理

配置集群nacos:

进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf配IP 修改application.properties文件,添加数据库配置 配置完成后复制三份模拟,将三个nacos的端口改为不一样的启动nacos,在bin目录下的命令是startup

nginx的反向代理:

修改conf/nginx.conf文件,配置 此时访问nacos的路径为:localhost/nacos 即可进入nacos的网址,虽然只有一个网址,由于nginx的存在nacos做了负载均衡

相关链接

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