Java分布式微服务1——注册中心(Eureka/Nacos)

news2024/11/24 1:58:41

文章目录

  • 基础知识
  • 注册中心
    • Eureka注册中心与Ribbon负载均衡
      • 1、Eureka注册中心
      • 2、Eureka的搭建
      • 3、Eureka服务注册
      • 4、复制服务实例
      • 5、拉取服务
      • 6、Ribbon负载均衡的流程及Eureka规则调整:
      • 7、Ribbon负载均衡饥饿加载
    • Nacos注册中心
      • 1、服务端Nacos安装与启动
      • 2、客户端Nacos注册
      • 3、Nacos分级存储模型
      • 4、修改NacosRule负载均衡规则
      • 5、Nacos环境隔离
      • 6、Nacos注册中心与Eureka注册中心的区别
      • 7、Nacos统一配置管理与热更新
        • 配置管理
        • 配置热更新
      • 8、多环境配置共享
      • 9、Nacos集群

基础知识

远程调用
向其他服务器请求信息(远程调用)
先在application或者configuration中注册一个Bean方便之后使用(可忽略)

@Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

使用restTemplate方法发送请求
getForObject/postForObject/…

User user = restTemplate.getForObject("http://localhost:8081/user/"+order.getUserId(), User.class);

注册中心

Eureka注册中心与Ribbon负载均衡

1、Eureka注册中心

上面的url是硬编码写死的,很不方便切换,所以使用Eurake注册中心来管理服务提供者的地址
Eureka相当于一个中介所,所有其他微服务都是它的客户(eureka-client)

  • 每个微服务启动的时候都会给Eureka注册自己的信息
  • 其他微服务从Eureka用名称就能找到对应微服务提供者,并远程调用。
  • 每个微服务提供者会以30s为间隔和Eureka通报自己的状态,即“心跳”,以确保它可用
  • 使用负载均衡(Ribbon),从几个实例中挑一个(一个微服务在实际工作中可以有多个实例的)

2、Eureka的搭建

1、引入服务端依赖

<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2、使用@EnableEurekaServer自动装配

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

3、配置文件(注册Eureka自己,方便之后的Eureka集群)

server:
  port: 10086
spring:
  application:
    name: eurekaserver # 服务名称
eureka:
  client:
    service-url: # eureka地址信息
      defaultZone: http://127.0.0.1:10086/eureka

3、Eureka服务注册

1、引入客户端依赖

<dependency>
	   <groupId>org.springframework.cloud</groupId>
	   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2、配置文件添加服务名字和Eureka服务的地址
记得给服务添加名字,不然没办法去找到这个服务

spring:
  application:
    name: userservice # 服务名称

eureka:
  client: 
    service-url: # eureka 的地址
      defaultZone: http://127.0.0.1:10086/eureka

4、复制服务实例

右键复制
在这里插入图片描述
在弹出窗口中VM option输入-Dserver.port=11111来选择一个端口,就会产生一个新的服务

5、拉取服务

1、给RestTemplate添加负载均衡注解

@Bean
@LoadBalanced // eureka负载均衡
public RestTemplate restTemplate(){
    return new RestTemplate();
}

2、使用RestTemplate对象,将地址直接换成服务名称,(有问题可以保留端口号试一下)

// 对比  restTemplate.getForObject("http://localhost:8081/user/"+order.getUserId(), User.class);
User user = restTemplate.getForObject("http://userservice/user/"+order.getUserId(), User.class);

这样就可以从eureka直接通过名字拉取服务,而不是写死服务地址

6、Ribbon负载均衡的流程及Eureka规则调整:

Ribbon是被Spring Boot Cloud内置的,它可以帮助开发人员更轻松地实现客户端负载均衡。
Eureka和Nacos都使用了Ribbon来做负载均衡操作

在这里插入图片描述其中IRule是一个代表查询规则的接口,它有很多实现类(默认ZoneAvoidanceRule):
在这里插入图片描述
调整规则的方法(在消费者处修改):

  1. 在Application或者Configuration中定义IRule的Bean,等于把容器中系统默认放进去的对象替换了
@Bean
public IRule randomRule(){
	return new RandomRule();
}
  1. 局部地调整负载均衡规则,在配置文件.yml中添加配置(下面的例子是对userservice服务请求时使用随机选取规则)
userservice:
	ribbon:
		NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

7、Ribbon负载均衡饥饿加载

Ribbon是个懒加载,第一次访问的时候才创建RibbonLoadBalancerClient,第一次请求时间长
饥饿加载会在项目启动时创建,第一次访问快,下面是一个对userservice、orderservice执行饥饿加载的示例
多个服务需要用“- name”

ribbon:
  eager-load:
    enabled: true # 开启饥饿加载
    clients: 
    	- userservice 
    	- orderservice

Nacos注册中心

alibaba提供的注册中心

1、服务端Nacos安装与启动

Nacos是要装在服务器端的,学习的时候就装在本机
Nacos下载,下载压缩包,解压到非中文路径中
控制台cmd在当前目录startup -m standalone以单节点模式启动(默认是集群模式,会报IO错误)
上面有一个地址是控制台,账号密码默认nacos

2、客户端Nacos注册

  1. 在父工程中添加spring-cloud-alibaba的管理依赖(从springboot官网找)
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>{project-version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
  1. 删掉Eureka的依赖,会产生冲突,也记得删掉eureka的@LoadBalanced注释等东西
  2. 添加nacos客户端依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 修改配置,注释eureka地址,加入nacos的地址和端口(默认8848)
spring:
  cloud:
    nacos:
      server-addr: http://127.0.0.1:8848 # nacos 服务端地址

启动客户端微服务,这个时候在你的nacos控制台服务列表就能看到了
和eureka一样,nacos也要在application上定义一个RestTemplate的Bean并且加上@LoadBalanced,使用时也是直接用服务名代替地址

3、Nacos分级存储模型

把服务的多个实例分到多个集群中,每个集群一般不在一个地理位置
形成 服务-集群-实例 多级架构
一般尽可能使用本地集群(快),有故障的时候才使用异地的
在这里插入图片描述在客户端修改application.yml添加配置集群名称即可

spring:
	  cloud:
	    nacos:
	      server-addr: http://127.0.0.1:8848 # nacos 服务端地址
	      discovery:
	        cluster-name: ChengDu # 配置集群名称,一般是机房位置

先启动两个实例,再把集群名字改了启动另一个实例,就可以模拟两个集群的情况了
我在这个时候需要重新启动nacos,可能是突然多了一个集群它有点呆,连不上控制台了

4、修改NacosRule负载均衡规则

Nacos也是用了Spring cloud的Ribbon负载均衡
修改规则就是给Ribbon不同的规则实现类

  1. 优先寻找与自己同集群的服务,本地集群中的实例随机选择
userservice:
	ribbon:
		NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
  1. 根据权重控制访问频率
    在服务详情中编辑实例权重,值越大权重越高,权重变成0就不会被调用(这个时候就可以更新升级这个实例)
    在这里插入图片描述

5、Nacos环境隔离

Nacos的服务存储和数据存储的最外层都是一个namespace,用来做最外层隔离,不同namespace的不能互相访问
Nacos控制台命名空间选项选择新建
在这里插入图片描述

在application.yml中添加配置将服务分到某命名空间

spring:
	cloud:
		nacos:
			discovery:
				namespace: 71097ffc-c1e7-471b-8538-879599cbf6eb # 命名空间id

6、Nacos注册中心与Eureka注册中心的区别

Nacos会把实例分成临时(默认)或非临时,对他们的健康检测不同

  1. 对临时实例与Eureka一样对Nacos服务器发送心跳检测,出现问题就剔除该实例
  2. 对非临时实例不做心跳,而是Nacos服务器主动发请求询问服务提供者状态,不健康时也不会剔除,会一直问
  3. Nacos中,不仅客户端会定时从注册中心拉取服务(与Eureka相同),注册中心也会主动推送服务的变更信息

服务提供者中添加配置,从而设置为非临时实例

spring:
	cloud:
		nacos:
			discovery:
				ephemeral: false # 设置为非临时实例

7、Nacos统一配置管理与热更新

配置管理

一个服务的配置文件可能和几十个服务实例有关系,在更新配置后这些服务都需要重启
我们需要对服务的配置统一管理,并且对实例做热更新
在Nacos控制台配置管理新增配置,配置内容里应该是可能有变化的配置,不是所有配置 yml就是yaml
在业务中使用Spring的@Value注解就可以去读取配置文件中的值

之后在项目启动时会先读取nacos配置文件,再读取本地配置文件application.yml并且将其合并,再创建spring容器加载bean

在这里插入图片描述

  1. 引入Nacos的配置管理客户端依赖
<!--        nacos配置管理-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
  1. 在resource中新建bootstrap.yml文件,它是个引导文件,这个文件的优先级比nacos.yml和application.yml都要高
    ,我们可以把nacos服务器信息和配置文件信息写在bootstrap.yml中,以方便找到服务对应配置
# 配置的名字是userservice-dev.yaml
spring:
  application:
    name: userservice # 服务名称,就是配置名称的前半段
  profiles:
    active: dev # 开发环境,这里是dev,配置名称的后半段
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos地址
        file-extension: yaml # 文件后缀名

如果出问题试一下加上bootstrap的依赖,新版springboot不默认启动它

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bootstrap -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
    <version>4.0.4</version>
</dependency>

还要注意nacos控制台中配置文件和服务需要在一个namespace中!!!
@Value获取不到配置的问题查看这个博主

配置热更新

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

@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
    @Value("${pattern.dateformat}") // 尝试通过名字获取nacos配置文件中的值
    private String dateformat;
}

方法二:使用@ConfigurationProperties
新建一个类,要保证:

  • 其结构与nacos配置文件中的某条相同(重要)
  • 有Getter和Setter方法
  • 注解中使用相同前缀prefix
  • @Component以方便其他地方使用
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}

//对比配置文件的内容
pattern:
    dateformat: yyyy-MM-dd HH:mm:ss

8、多环境配置共享

有的配置是多个环境共有的
在这里插入图片描述
配置优先级:

服务名-profile.yaml>服务名.yaml>本地配置文件

9、Nacos集群

这篇博文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/850617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MinIO:微服务中上传图片流程

1、在nacos中配置minio参数 2、controller层 package com.heima.wemedia.controller.v1;import com.heima.model.common.dtos.ResponseResult; import com.heima.wemedia.service.WmMaterialService; import org.springframework.beans.factory.annotation.Autowired; import …

瑞数系列及顶像二次验证LOGS

瑞数商标局药监局专利局及顶像二次验证 日期&#xff1a;20230808 瑞数信息安全是一个专注于信息安全领域的公司&#xff0c;致力于为企业和个人提供全面的信息安全解决方案。他们的主要业务包括网络安全、数据安全、应用安全、云安全等方面的服务和产品。瑞数信息安全拥有一支…

AMASS database

AMASS是一个由不同的光学标记运动捕捉数据集统一表示在一个公共框架和参数化下的大型人体运动数据库。它包含了超过40小时的运动数据&#xff0c;涵盖了300多个主体和11000多个运动。它使用了SMPL人体模型&#xff0c;它是一种基于混合形状和姿态空间的生成式人体模型&#xff…

用html+javascript打造公文一键排版系统15:一键删除所有空格

现在我们来实现一键删除所有空格的功能。 一、使用原有的代码来实现&#xff0c;测试效果并不理想 在这之前我们已经为String对象编写了一个使用正则表达式来删除所有空格的方法&#xff1a; //功能&#xff1a;删除字符串中的所有空格 //记录&#xff1a;20230726创建 Stri…

WPF上位机9——Lambda和Linq

Lambda Linq 操作集合 使用类sql形式查询 Linq To SQL

PCB电路板设计基础入门学习笔记

文章目录&#xff1a; 一&#xff1a;Arduino线路板绘制&#xff08;原理图库、PCB库、原理图、PCB图绘制&#xff09; 1.原理图库绘制Schematic Library&#xff08;有现成库&#xff0c;没有就自己画&#xff09;[SCH Library] 方法一&#xff1a;自己依次画 ATMEGA328P-…

滑动窗口(全面清晰/Java)

数组模拟单调队列 分析 以k3举例&#xff1a; (1)利用单调队列的性质&#xff1a; <1>最小值&#xff1a;确保队列单调递增&#xff0c;处理后&#xff0c;队头即是最小值。 <2>最大值&#xff1a;确保队列单调递减&#xff0c;处理后&#xff0c;队头即是最大值…

【CSS】文本效果

文本溢出、整字换行、换行规则以及书写模式 代码&#xff1a; <style> p.test1 {white-space: nowrap; width: 200px; border: 1px solid #000000;overflow: hidden;text-overflow: clip; }p.test2 {white-space: nowrap; width: 200px; border: 1px solid #000000;ove…

Prometheus技术文档--基本安装-docker安装并挂载数据卷-《十分钟搭建》

一、查看可安装的版本 docker search prom/prometheus 二、拉取镜像 docker pull prom/prometheus 三、查看镜像 docker images 四、书写配置文件-以及创建挂载目录 宿主机挂载目录位置&#xff1a; 以及准备对应的挂载目录&#xff1a; /usr/local/docker/promethues/se…

【LeetCode每日一题】——219.存在重复元素II

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 简单 三【题目编号】 219.存在重复元素II 四【题目描述】 给你一个…

[考研机试] KY20 完数VS盈数 清华大学复试上机题 C++实现

描述 一个数如果恰好等于它的各因子(该数本身除外)子和&#xff0c;如&#xff1a;6321。则称其为“完数”&#xff1b;若因子之和大于该数&#xff0c;则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。 输入描述&#xff1a; 题目没有任何输入。 输出描述&#…

体验自制免费开源闯关学SQL

文章目录 前言mac安装nodejs启动体验 前言 sql是常用必不可少的一种语言&#xff0c;我们都或有各种各样的学习经历&#xff0c;最近看鱼皮大佬开源了一款自制的闯关学SQL项目&#xff0c;该项目是纯前端语言&#xff0c;不需要太多依赖以及前置知识&#xff0c;直接下载就可以…

flutter开发实战-video_player视频播放功能及视频缓存

flutter开发实战-video_player视频播放功能及视频缓存 最近开发过程中video_player播放视频&#xff0c; 一、引入video_player 在pubspec.yaml引入video_player video_player: ^2.7.0在iOS上&#xff0c;video_player使用的是AVPlayer进行播放。 在Android上&#xff0c;…

python中文官网下载安装,python官方中文文档下载

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python官网下载步骤图解&#xff0c;python官方中文文档下载&#xff0c;现在让我们一起来看看吧&#xff01; python官网网址 python官方网站 python官网网址中文。像我们想要抓住一门好的编程语言&#xff0c;如何开始…

Yolov5缺陷检测/目标检测 Jetson nx部署Triton server

使用AI目标检测进行缺陷检测时&#xff0c;部署到Jetson上即小巧算力还高&#xff0c;将训练好的模型转为tensorRT再部署到Jetson 上供http或GRPC调用。1 Jetson nx 刷机 找个ubuntu 系统NVIDIA官网下载安装Jetson 的sdkmanager一步步刷机即可。 本文刷的是JetPack 5.1, 其中包…

PS透明屏,在科技展示中,有哪些优点展示?

PS透明屏是一种新型的显示技术&#xff0c;它将传统的显示屏幕与透明材料相结合&#xff0c;使得屏幕能够同时显示图像和透过屏幕看到背后的物体。 这种技术在商业展示、广告宣传、产品展示等领域有着广泛的应用前景。 PS透明屏的工作原理是利用透明材料的特性&#xff0c;通…

(树) 剑指 Offer 36. 二叉搜索树与双向链表 ——【Leetcode每日一题】

❓ 剑指 Offer 36. 二叉搜索树与双向链表 难度&#xff1a;中等 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个 排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为…

python+vue生成条形码码并展示

需求 最近想做一个小工具&#xff0c;大概要实现这样的效果&#xff1a;后端生成条形码后&#xff0c;不保存到服务器&#xff0c;直接返回给前端展示。 大概思路是&#xff0c;通过 python-barcode库 生成条码的字节流&#xff0c;生成字节流后直接编码成base64格式返回给前…

关于Vue构建低代码平台的思考

一、前言 在项目实战开发中&#xff0c;尤其是大平台系统的搭建&#xff0c;针对不同业务场景&#xff0c;需要为用户多次编写用于录入、修改、展示操作的相应表单页面。一旦表单需求过多&#xff0c;对于开发人员来说&#xff0c;算是一种重复开发&#xff0c;甚至是繁杂的工作…

国产语音芯片里面可重复擦写语音芯片有哪些?可以在线烧写语音

目录 详细测试 主要是做一个测试板&#xff0c;对KT148A一线通讯的芯片进行测试和验证&#xff0c;实现的功能有两点。 2.1 第一步--硬件环境的搭建 2.2 第二步--自己更换声音的测试 三、总结 简介 基本目前的语音芯片&#xff0c;尤其是SOP8的封装类型的芯片&#xff0c;都绕…