0_2-1springcloud微服务治理_Erureka、Ribbon、Nacos

springcloud微服务治理_Erureka、Ribbon、Nacos

(内容为学习内容,不排除内容出错,若读者发现,可与作者沟通,谢谢)
在这里插入图片描述

在这里插入图片描述
服务拆分:单体按功能拆分后的单个 模块/服务。
远程调用:同一个项目中,分别在不同机器上的不同服务之间的调用

spring提供的 ,服务之间发出 http请求的工具 ——RestTemplate

  1. RestTemplate的注入Spring容器:需要在Spring的配置类
	@Bean
    //微服务调用
    public RestTemplate restTemplate() {  return new RestTemplate();}
  1. 依赖注入+远程调用
@Autowired    
 private RestTemplate restTemplate;
 ------------------------------------
 String url = "http:// .....:.../../.. 需要查询的资源路径 ";
 restTemplate.getForObject(url,查询资源实体类.class);  //根据请求不同可使用不同方法如:putForObject
 对调用的资源封装到指定位置;//order.setUser(user)  //order为调用者,setUser为调用者实体类方法,user是上一步返回的结果;

Eureka

服务调用关系:服务消费者、服务提供者(角色是相对的)

Eureka注册中心:(Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。)

Eureka架构中,分两端,

  • Eureka Server(记录管理监控 微服务,健康检测(检测心跳)等)
  • EurekaClient(注册信息和拉取服务,每30s发送一次心跳)有分为 消息的 消费者 和 生产者

对服务信息的选择 ——使用“负载均衡算法”,来选择具体服务

Eureka 实现:EurekaServer -> EurekaClient注册 -> 服务拉取
依赖基础:spring-boot-starter-parent、spring-cloud-dependencies
一 搭建EurekaServer:

  1. 依赖: spring-cloud-starter-netflix-eureka-server
  2. 新建EurekaServer(模块)的启动类加注解:@EnableEurekaServer
  3. application.yml配置文件:
#1服务端口
server:
  port:     #eurekaServer的指定端口  #因为eureka本身也是个服务,所以要注册到集群中

spring:
  application:
    # 2微服务名称,将会显示在Eureka界面的应用名称列
    name: eurekaClientName1

# 3Eureka服务器的地址,类型为HashMap,缺省的Key为 defaultZone;缺省的Value为 http://localhost:8761/eureka
# 如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。

eureka:  
  client:
    service-url:   
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/   #eurekaServer集群地址

二 erekaClient 服务 注册(2)

  1. 所需服务依赖:spring-cloud-starter-netflix-eureka-client
  2. application.yml配置文件:
server:
  port: 8081   #1服务地址
spring:
  application:
    name:    #2 eureka客户端名称
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka/       #3 eurekaServer集群地址

单服务多实例部署:IDEA中开启的服务控制台,需要的服务右击 “Copy Configuration” ,弹出的Edit Configuration中:Configuration->Environment -> VM options: -Dserver.port-端口

三 order-service服务 发现/拉取:

  1. 修改某服务访问其他服务地址,用服务名代替ip:
    原来:String url = "http://localhost:8081/user/"+ order.getUserId();//用户id动态获取
    改后:String url = "http://生产者eureka客户端名/user/"+ order.getUserId();//用户id动态获取
    如:
String url = "http://userservice/user/"+ order.getUserId();//用户id动态获取        User user = restTemplate.getForObject(url, User.class);        order.setUser(user);
  1. 在需要eureka的服务的服务的RestTemplate整合api,添加负载均衡注解:@LoadBalanced——表明此服务发出的请求将被Ribbon拦截处理

Ribbon组件

负载均衡与服务调用 实现——Ribbon组件
String url = "http://userservice/user/"+ order.getUserId()

@LoadBalanced——表明此服务发出的请求将被Ribbon拦截处理
具体实现——LoadBalancerInterceptor(接口实现ClentHttpRequestInterceptor)
负载均衡 的规则—— IRule接口
Ribbon工作流程:
在这里插入图片描述

IRule实现类来配置 负载均衡策略:
在这里插入图片描述
IRule负载均衡策略 配置:

方法1:代码实现:(作用全局)

@Bean     //定义在配置中
    public IRule randomRule(){     //  全局范围为 全局  对所有调用的所有服务都随机
        return new RandomRule();   //将负载均衡规则设置为random
    }

方法2:配置文件application.yml(针对某个服务而言)

userservice:   #针对 指定微服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule    #NFLoadBalancerRuleClassName :规则类名称

Ribbon负载均衡 加载策略:

Ribbon默认懒加载(每次第一次发起请求时才去 创建Ribbon的 Load BalanceClient(过程中拉取))
设置饥饿加载

ribbon:
  eager-load:
    enabled: true   #开启饥饿加载,默认false
    clients:     #指定饥饿加载服务名称
      - userservice
      - * service

Nacos的注册中心
在这里插入图片描述
安装包在github上。

Nacos的注册中心(原阿里产品,现springcloud组件)端口:8848 默认账号&密码:nacos

Windows命令启动:单机启动startup.cmd -m standalone -m为模式, standalone为单机启动

Nacos配置:

  1. 所有服务的 父工程——添加nacos管理依赖:
<dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.5RELEASE</version>     
                <type>pom</type>
                <scope>import</scope>
            </dependency>
  1. 为client服务——添加依赖:spring-cloud-starter-alibaba-nacos-discovery
  2. 所有子服务配置文件:
spring
  application:
    name: userservice    #当前服务名称
  cloud:
    nacos:
      server-addr: localhost:8848     #服务端访问地址

Nacos服务分级存储模型:
一个服务多个实例,不能放到一个注册中心检测,实现容灾技术,服务的每个实例按地域划分为不同的 集群
服务-> 集群->实例

Nacos服务 集群 属性配置:(优先调用本地 服务集群)
在 消费者 客户端:

  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name:    #指定集群(配属到哪个集群)名称 #配置重启服务

IDEA中配2个不同集群,只需先启动第1个,后修改集群名称后,再启动另一个service;

Nacos的负载均衡策略默认为随机,如果想配置,如下
NacosRule负载均衡策略:
集群负载均衡:使得拉去服务时优先从本地集群中寻找,确定实例列表厚随后选择实例
消费者 服务中:

userservice:      #对指定服务名,配置负载均衡规则
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule   #负载均衡规则——优先访问本地集群(本地还是随机)

服务实例 权重负载均衡:
通过权重配置控制分频率,权重越大访问频率越高(0-1之间),可通过Nacos网页配置

Nacos——既是服务注册中心、也是数据中心,(服务数据分离——环境隔离)
为区分服务和数据——环境隔离namespace

Nacos中服务存储和数据存储最外层是一个名为namespace,用来做外层隔离;
namespace -> Group -> Service/Data(概念划分,非必须)
在这里插入图片描述

命名空间默认一个,在Nacos访问地址新建命名空间后(如果不手动设置ID,会自动生成一个ID)
非同一个命名空间下的服务无法相互访问——不同namespace下的服务不可见

环境隔离配置步骤:

  1. 网页配置命名空间,得到 命名空间ID
  2. 在代码中设置(拿命名空间ID),消费者客户端 修改服务application.yml:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name:     #集群名称
        namespace:     #命名空间ID

Rureka和Nacoa的共同点:
都支持注册和服务拉取、支持服务提供者心跳方式做健康检测

Rureka和Nacoa的区别:

  1. Nacos服务端 主动检测提供者状态:临时实例采用心跳检测,非临时实例采用主动检测
  2. 临时实例心跳不正常会被剔除,非临时实例不会
  3. Nacos支持服务列表表更的信息推送拉取(push/pull)模式(Eureka只是拉去服务信息),服务列表更新及时
  4. Naxos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka只支持AP方式
    (心跳检测:服务提供者每隔一段时间,向注册中心发送请求)

服务的 健康检测
Nacos和Eureka,健康检测时,把服务提供者实例是否分临时实例和非临时实例(健康检测频率不一样)
消息生产者:当Nacos中,服务实例为临时实例时,健康状态变成false的话,nacos注册中心 直接剔除该服务,不再进行心跳检测(而非临时实例会)等待服务再次恢复正常状态;
消息消费者:Eureka在一定时间只采用pull服务,而nacos 不仅pull,还会做服务push推送(主动)

Nacos是否 临时实例 的配置:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        ephemeral:     #临时实例默认true为临时实例,false

nacos集群默认采用AP方式,非临时时CP;
eureka采用AP;




Nacos(管理、注册)之 配置(服务配置文件的配置内容)管理
配置更改的热更新

服务集群的 共享配置文件内容的配置 ——通过Nacos实现
(统一配置隔离、配置热更新、配置共享、搭建Nacos集群 )

服务的统一 配置管理 服务
一 Nacos 网页配置 配置列表 ——根据组配置
共享配置文件名:DataID : 命名方式:业务名-项目运行环境(dev/pro/test)-.yaml 、
配置内容:输入 共享服务配置(配置内容:大多是 (热更新需求)变化的 配置,如开关类型
在这里插入图片描述
二 微服务读取Nacos 设置的共享服务配置:
bootstrap.yml :springboot引导文件,优先级高于application.yml
在这里插入图片描述
将有关Nacos有关的所有配置都设置到 bootstrap.yml 配置文件中
实现步骤:

  1. Nacos(配置管理 客户端)依赖:
<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
  1. resource下创建bootstrap配置文件:
#此内容需要和Nacos网页的console配置管理列表一致
spring:
  application:
    name: userservice  #为共享配置的 服务名称    要与网页共享配置文件的 一致  服务要读取配置的名称
  profiles:
    active: dev  #运行环境    要与网页共享配置文件的 一致  
  cloud:
    nacos:
      server-addr: localhost:8848   #Nacox访问地址     服务要去读取配置的地址
      config:
        file-extension: yaml     #后缀 nacos服务端共享配置文件 后缀一致

后将服务原配置与此配置文件重复内容删除;



热更新是一种App软件开发者常用的更新方式。简单来说,就是在用户通过下载安装APP之后,打开App时遇到的即时更新。
设置共享配置的 目的 是为了 : 配置热更新
配置的热更新:

热更新实现——配置自动刷新
方式1:在(属性注入)@Value注入的变量(使用了共享配置内容的)所在类加注解@RefreshScope
方式2:使用(属性自动注入)@ConfigurationProperties(prifix=“服务端配置变量”)注解 (推荐)

多环境(运行环境) 配置共享
服务到nacos服务端会就在两种配置文件:服务名+环境+.yaml 和 服务名.yaml

多环境配置共享:利用 服务名.yaml 配置文件

当本地,nacos服务端两种配置文件 有相同配置时;
配置优先级:服务名-prifile.yml(单环境) > 服务名.yml(多环境共享) > 本地配置



Naxos集群搭建:

搭建模型:
在这里插入图片描述

简单搭建:

  1. 搭建数据库,初始化数据库表架构

  2. 下载安装nacos

  3. 配置nacos组件 节点(不同机器的nacos配置):
    nacos软件 配置文件中:
    集群配置:cluster.conf(去除.example)设置 集群中 每个 nacos 作为节点的 配置 :直接写: ip:端口;
    修改mysql数据库配置信息+nacos服务端口:application.properties修改有关db相关内容(1.打开mysql数据源:spring.datasource.platform=mysql 2.有关 Connect URL of DB 的内容打开(删除#)并修改其他)

  4. 启动nacos集群:集群启动:Windows系统下 单个nacal: 直接用命令行进行启动命令

  5. nginx反向代理 ,nginx软件的配置文件配置:nginx/cong/nginx.conf :文件http中

#配置nacos集群(最后nginx会对IP地址做负载均衡)
upstream nacos-cluster {   #集群
        server 具体IP端口
        server 具体IP端口
        ...
}    
#反向代理配置
server {
#若此处配置,下次访问可用指定的IP,非nacos的8848
   listen   nginx端口;
   server_name    :nginx的IP;

#若访问 含"/nacos"路径的,就做代理到上面的服务集群中
   location  /nacos  }
       proxy_pass  http://nacos_cluster;
   
  1. nginx重启
  2. 可直接使用 IP/nacos访问
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值