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

文章目录

  • 基础知识
  • 注册中心
    • 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集群

这篇博文

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

管理类联考——逻辑——论证逻辑——汇总篇——目录+提炼

文章目录 一、削弱没有特点的削弱方法关系的削弱必要方法的削弱因果推理的削弱果因推理的削弱概念跳跃的削弱数量比例的削弱比例因果的削弱有效提醒 二、支持方法关系的支持必要方法的支持因果推理的支持果因推理的支持概念跳跃的支持数量比例的支持比例因果的支持 三、假设方法…

IntelliJ IDEA Bookmark使用

1 增加 右键行号栏 2 查看 从favorite这里查看 参考IntelliJ IDEA 小技巧&#xff1a;Bookmark(书签)的使用_bookmark idea 使用_大唐冠军侯的博客-CSDN博客

Windows11右键菜单

刚开始使用Windows11时&#xff0c;新的右键菜单用起来很不习惯。 记录一下修改和恢复Windows11的右键菜单的方法。 1.Win11切换到旧版右键菜单&#xff1a; 方法&#xff1a;WinR打开CMD&#xff0c;运行下面的命令行 添加注册列表重启Windows资源管理器 reg add "HKC…

设备管理系统:提升生产制造企业效率与竞争力的关键

在现代生产制造行业中&#xff0c;设备是企业生产力的核心。有效管理和维护设备对于提高生产效率、降低成本、确保产品质量至关重要。为了满足这些需求&#xff0c;越来越多的生产制造企业开始采用设备管理系统。本文将探讨设备管理系统的重要性以及它对企业的益处。 设备管理…

Qt6之QStackedWidget——Qt仿ToDesk(2)

一、 QStackedWidget概述 QStackedWidget也叫堆栈窗体类&#xff0c;它继承于QFrame&#xff0c;主要与QListWidget等结合使用&#xff0c;实现“一个界面多个页面切换”。 二、QStackedWidget示例 如下图&#xff0c;当点击左边 QListWidget里的菜单时&#xff0c;右边跟随切…

深入学习JVM —— GC垃圾回收机制

前言 前面荔枝已经梳理了有关JVM的体系结构和类加载机制&#xff0c;也详细地介绍了JVM在类加载时的双亲委派模型&#xff0c;而在这篇文章中荔枝将会比较详细地梳理有关JVM学习的另一大重点——GC垃圾回收机制的相关知识&#xff0c;重点了解的比如对象可达性的判断、四种回收…

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

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

linux之find命令

概览 Linux下find命令在目录结构中搜索文件&#xff0c;并执行指定的操作。Linux下find命令提供了相当多的查找条件&#xff0c;功能很强大。由于find具有强大的功能&#xff0c;所以它的选项也很多&#xff0c;其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络…

ffplay数据结构分析(一)

本文为相关课程的学习记录&#xff0c;相关分析均来源于课程的讲解&#xff0c;主要学习音视频相关的操作&#xff0c;对字幕的处理不做分析 下面我们对ffplay的相关数据结构进行分析&#xff0c;本章主要是对PacketQueue的讲解 struct MyAVPacketList和PacketQueue队列 ffp…

常量池-JVM(十九)

上篇文章说gc日志以及arthas。 Arthas & GC日志-JVM&#xff08;十八&#xff09; 一、常量池 常量池主要放两大类&#xff1a;字面量和符号引用。 字面量就是由字母、数字等构成的字符串或者数值常量。 符号引用主要包含三类常量。 类和接口的全限定名。字段的名称和…

【毕业项目】自主设计HTTP

博客介绍&#xff1a;运用之前学过的各种知识 自己独立做出一个HTTP服务器 自主设计WEB服务器 背景目标描述技术特点项目定位开发环境WWW介绍 网络协议栈介绍网络协议栈整体网络协议栈细节与http相关的重要协议 HTTP背景知识补充特点uri & url & urn网址url HTTP请求和…

python的virtualenv虚拟环境无法激活activate

目录 问题描述&#xff1a; 解决办法&#xff1a; 解决结果&#xff1a; 问题描述&#xff1a; PS D:\pythonProject\pythonProject\DisplayToolLibs\venv\Scripts> .\activate .\activate : 无法加载文件 D:\pythonProject\pythonProject\DisplayToolLibs\venv\Scripts\…

form-create-designer整合element-plus使用方法

最近在使用form-create-designer生成表单的时候遇到了很多问题和各种报错&#xff0c;按照官方文档的方法一步步来做&#xff0c;发现行不通&#xff0c;后来经过不断尝试&#xff0c;终于找到了使用方法&#xff0c;这里做一下总结。 1、安装所需的依赖包 npm install eleme…

Redhat Linux 安装MySQL安装手册

Redhat安装MySQL安装手册 1 下载2 上传服务器、解压并安装3 安装安装过程1&#xff1a;MySQL-shared-5.6.51-1.el7.x86_64.rpm安装过程2&#xff1a;MySQL-shared-compat-5.6.51-1.el7.x86_64.rpm安装过程3&#xff1a;MySQL-server-5.6.51-1.el7.x86_64.rpm安装过程4&#xff…

AWS-自定义ami的S3存取使用

需要提前配置好aws-cli哈 对应的区域 要统一 示例&#xff1a;即AWS-CLI 和 EC2、AMI、S3以上资源均要使用同已区域&#xff0c;以下拿新加坡举例 1.新建自定义AMI 2.查看ami状态 确认是可用状态&#xff0c;才能开始操作 3.aws-cli 开始存入s3 只能使用桶的根目录 开始上…

【golang】工作区与GOPATH

在学习go语言时&#xff0c;我们会从官网下载go语言的二进制包&#xff0c;然后解压并安装到某个目录&#xff0c;最后会配置环境变量&#xff0c;通过输入命令go version来验证是否安装成功。 配置了path环境后&#xff0c;我们还需要再配置3个环境变量&#xff0c;GOROOT、G…

XML(eXtensible Markup Language)

目录 为什么需要XML? 一 XML语法 1.文档声明 2.元素 语法: 3.属性 4.注释 5.CDATA节 二 树结构 三 转义字符 四 DOM4J 1.XML解析技术 2.dom4j介绍 3.dom4j基本使用 XML 指可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;。 XML 被设计用来传…

【新】通达OA前台反序列化漏洞分析

0x01 前言 注&#xff1a;本文仅以安全研究为目的&#xff0c;分享对该漏洞的挖掘过程&#xff0c;文中涉及的所有漏洞均已报送给国家单位&#xff0c;请勿用做非法用途。 通达OA作为历史上出现漏洞较多的OA&#xff0c;在经过多轮的迭代之后已经很少前台的RCE漏洞了。一般来说…

Redis实战案例27-UV统计

1. Redis的HyperLogLog的统计功能 示例&#xff1a; 表明HyperLogLog不管加入重复元素多少次都不会让count&#xff0c;不会计数重复元素&#xff0c;所以适合做UV计数 2. 简单实现UV测试 通过单元测试&#xff0c;向 HyperLogLog 中添加 100 万条数据&#xff0c;看看内存占…

RocketMQ使用

说明&#xff1a;本文介绍RocketMQ的消费模式&消息类型&#xff0c;RocketMQ的安装参考及简单使用&#xff0c;参考&#xff1a;http://t.csdn.cn/BKFPj 消费模式 RocketMQ与RabbitMQ最大的区别在于&#xff0c;RocketMQ是根据消息的Topic锁定消费者的&#xff0c;Topic属…