SpringCloud实用篇1——eureka注册中心 Ribbon负载均衡原理 nacos注册中心

目录

  • [1 微服务](#1 微服务)
    • [1.1 微服务的演变](#1.1 微服务的演变)
    • [1.2 微服务](#1.2 微服务)
    • [1.3 SpringCloud](#1.3 SpringCloud)
    • [1.4 小结](#1.4 小结)
  • [2 服务拆分及远程调用](#2 服务拆分及远程调用)
    • [2.1 服务拆分](#2.1 服务拆分)
    • [2.2 服务拆分案例](#2.2 服务拆分案例)
    • [2.3 实现远程调用](#2.3 实现远程调用)
    • [2.4 提供者与消费者](#2.4 提供者与消费者)
  • [3 Eureka注册中心](#3 Eureka注册中心)
    • [3.1 Eureka的结构和作用](#3.1 Eureka的结构和作用)
    • [3.2 搭建eureka-server](#3.2 搭建eureka-server)
    • [3.3 服务注册](#3.3 服务注册)
    • [3.4 服务发现](#3.4 服务发现)
  • [4 Ribbon负载均衡](#4 Ribbon负载均衡)
  • [5 Nacos注册中心](#5 Nacos注册中心)
    • 5.1.认识和安装Nacos
      • [5.1.1 Windows下安装Nacos](#5.1.1 Windows下安装Nacos)
      • [5.1.2 Linux下安装Nacos](#5.1.2 Linux下安装Nacos)
    • [5.2 服务注册到nacos](#5.2 服务注册到nacos)
    • [5.3 服务分级存储模型](#5.3 服务分级存储模型)
      • [5.3.1 给user-service配置集群](#5.3.1 给user-service配置集群)
      • [5.3.2 同集群优先的负载均衡](#5.3.2 同集群优先的负载均衡)
    • [5.4 权重配置](#5.4 权重配置)
    • [5.5 环境隔离](#5.5 环境隔离)
      • [5.5.1 创建namespace](#5.5.1 创建namespace)
      • [5.5.2 给微服务配置namespace](#5.5.2 给微服务配置namespace)
    • 5.6.Nacos与Eureka的区别

1 微服务

1.1 微服务的演变

单体架构:

  • 将业务的所有功能集中在一个项目中开发,打成一个包部署。
  • 优点:架构简单;部署成本低(打jar包、部署、负载均衡就完成了)
  • 缺点:耦合度高(维护困难、升级困难,不利于大项目开发)

分布式架构

  • 根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务
  • 优点:降低服务耦合;有利于服务升级和拓展
  • 缺点:服务调用关系错综复杂,难度大

分布式架构要考虑的问题:

服务拆分的粒度如何?每个服务对应唯一的业务能力。

服务集群地址如何维护?

服务之间如何调用?注册中心、消息队列

服务的调用关系如何管理?消息队列

1.2 微服务

微服务是一种经过良好架构设计的分布式架构方案 。

微服务的架构特征:

  • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责
  • 自治:团队独立、技术独立、数据独立,独立部署和交付
  • 面向服务:服务提供统一标准的接口,与语言和技术无关
  • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

全球的互联网公司都在积极尝试自己的微服务落地方案。其中在Java领域国内最知名的是SpringCloud和Dubbo。

微服务技术对比:

不同企业需求:

1.3 SpringCloud

SpringCloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud。

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。

其中常见的组件包括:
另外,SpringCloud底层是依赖于SpringBoot的,并且有版本的兼容关系,如下:

目前学习使用的版本是 Hoxton.SR10,因此对应的SpringBoot版本是2.3.x版本。

如果版本不兼容运行会报错:Error creating bean with name 'configurationPropertiesBeans' ...

1.4 小结

  • 单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统

  • 分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝

  • 微服务:一种良好的分布式架构方案

    ①优点:拆分粒度更小、服务更独立、耦合度更低

    ②缺点:架构非常复杂,运维、监控、部署难度提高

  • SpringCloud是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件

2 服务拆分及远程调用

2.1 服务拆分

微服务拆分时的几个原则:

  • 单一职责:不同微服务,不要重复开发相同业务
  • 数据独立:不要访问其它微服务的数据库
  • 面向服务:将自己的业务暴露为接口,供其它微服务调用


2.2 服务拆分案例

导入资料中的微服务cloud-demo,其结构:

注意修改自己的数据库密码

cloud-demo:父工程,管理依赖

  • order-service:订单微服务,负责订单相关业务
  • user-service:用户微服务,负责用户相关业务

要求:

  • 订单微服务和用户微服务都必须有各自的数据库,相互独立
  • 订单服务和用户服务都对外暴露Restful的接口
  • 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库

导入提供的cloud-order.sqlcloud-user.sql导入到mysql中:

tb_user:

tb_order:

运行demo,分别访问:

2.3 实现远程调用

需求:根据订单id查询订单的同时把订单所属的用户信息一起返回

根据上面的demo我们会发现在order-service服务中,有一个根据id查询订单的接口,返回的order对象中user为null

而案例需求:修改order-service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。

因此,我们需要在order-service中 向user-service发起一个http的请求,调用http://localhost:8081/user/{userId}这个接口。

大概的步骤是这样的:

  • 注册一个RestTemplate的实例到Spring容器
  • 修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User
  • 将查询的User填充到Order对象,一起返回

步骤1: 注册RestTemplate

在order-service服务中的OrderApplication启动类中,注册RestTemplate

java 复制代码
/**
 * 创建RestTemplate并注入Spring容器
 * @return
 */
@Bean
public RestTemplate restTemplate(){
    return new RestTemplate();
}

步骤2: 实现远程调用

修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法:

java 复制代码
@GetMapping("/{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
    // 1.根据id查询订单
    Order order = orderService.queryOrderById(orderId);
    //2. 利用RestTemplate发送http请求,查询用户
    //2.1 url
    String url = "http://localhost:8081/user/"+order.getUserId();
    //2.2 发送http请求实现远程调用
    User user = restTemplate.getForObject(url, User.class);
    //3. 封装User到Order
    order.setUser(user);
    //4. 返回
    return order;
}

restTemplate自动把json格式的数据转为了对象

测试效果:

微服务调用方式:

  • 基于RestTemplate发起的http请求实现远程调用
  • http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可。

2.4 提供者与消费者

在服务调用关系中,会有两个不同的角色:

服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)

服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

服务A调用了服务B,而服务B又调用了服务C,服务B的角色是什么?

  • 对于A调用B的业务而言:A是服务消费者,B是服务提供者
  • 对于B调用C的业务而言:B是服务消费者,C是服务提供者

因此,服务B既可以是服务提供者,也可以是服务消费者。

服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。

一个服务既可以是服务者也可以是消费者

3 Eureka注册中心

上面案例我们使用了硬编码获取了地址:

存在的问题:

  • order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?
  • 有多个user-service实例地址,order-service调用时该如何选择?
  • order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

3.1 Eureka的结构和作用


Eureka的作用

  • 消费者该如何获取服务提供者具体信息?
    • 服务提供者启动时向eureka注册自己的信息
    • eureka保存这些信息
    • 消费者根据服务名称向eureka拉取提供者信息
  • 如果有多个服务提供者,消费者该如何选择?
    • 服务消费者利用负载均衡算法,从服务列表中挑选一个
  • 消费者如何感知服务提供者健康状态?
    • 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
    • eureka会更新记录服务列表信息,心跳不正常会被剔除
    • 消费者就可以拉取到最新的信息

回答上面的各个问题。

问题1:order-service如何得知user-service实例地址?

获取地址信息的流程如下:

  • user-service服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端)。这个叫服务注册
  • eureka-server保存服务名称到服务实例地址列表的映射关系
  • order-service根据服务名称,拉取实例地址列表。这个叫服务发现或服务拉取

问题2:order-service如何从多个user-service实例中选择具体的实例?

  • order-service从实例列表中利用负载均衡算法选中一个实例地址
  • 向该实例地址发起远程调用

问题3:order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

  • user-service会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳
  • 当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除
  • order-service拉取服务时,就能将故障实例排除了

注意:一个微服务,既可以是服务提供者,又可以是服务消费者,因此eureka将服务注册、服务发现等功能统一封装到了eureka-client端

3.2 搭建eureka-server

步骤如下:

在cloud-demo父工程下,创建一个子Maven模块(创建eureka-server服务):

  1. 引入SpringCloud为eureka提供的starter依赖:
xml 复制代码
<!--eureka服务端-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  1. 给eureka-server服务编写一个启动类,一定要添加一个@EnableEurekaServer注解,开启eureka的注册中心功能
java 复制代码
package cn.itcast.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}
  1. 编写一个application.yml配置文件
yaml 复制代码
server:
  port: 10086
spring:
  application:
   name: eurekaservice #eureka的服务名称
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka #eureka的地址信息
  1. 启动服务
    启动微服务,然后在浏览器访问:http://127.0.0.1:10086
    看到下面结果应该是成功了:

3.3 服务注册

我们将user-service模块注册到eureka-server中去。

  1. 在user-service的pom文件中,引入下面的eureka-client依赖
xml 复制代码
<!--引入eureka客户依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  1. 在user-service中,修改application.yml文件,添加服务名称、eureka地址
yaml 复制代码
spring:
  application:
    name: userservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  1. 启动多个user-service实例

问题解决:在idea2022中复制 configuration改变项目端口的解决方案

启动:
查看eureka-server管理页面:

3.4 服务发现

在order-service完成服务拉取

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

我们将order-service的逻辑修改:向eureka-server拉取user-service的信息,实现服务发现。

  1. 引入依赖。之前说过,服务发现、服务注册统一都封装在eureka-client依赖,因此这一步与服务注册时一致。
  2. 配置文件。服务发现也需要知道eureka地址,因此第二步与服务注册一致,都是配置eureka信息
  3. 服务拉取和负载均衡
    最后,我们要去eureka-server中拉取user-service服务的实例列表,并且实现负载均衡。
    在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解

    修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法。修改访问的url路径,用服务名代替ip、端口:

    spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡。

4 Ribbon负载均衡

问题:上一节中,我们添加了@LoadBalanced注解,即可实现负载均衡功能,这是什么原理呢?

4.1 负载均衡原理

SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。

问题:发出的请求明明是http://userservice/user/1,如何变成http://localhost:8081的呢?

4.2 源码分析

为什么我们只输入了service名称就可以访问了呢?之前还要获取ip和端口。

显然有人帮我们根据service名称,获取到了服务实例的ip和端口。它就是LoadBalancerInterceptor,这个类会在对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。

我们通过断点调试进行源码跟踪:

LoadBalancerIntercepor

可以看到这里的intercept方法,拦截了用户的HttpRequest请求,然后做了几件事:

  • request.getURI():获取请求uri,本例中就是 http://user-service/user/8
  • originalUri.getHost():获取uri路径的主机名,其实就是服务id,user-service
  • this.loadBalancer.execute():处理服务id,和用户请求。

这里的this.loadBalancerLoadBalancerClient类型,我们继续跟入。

LoadBalancerClient

继续跟入execute方法:

  • getLoadBalancer(serviceId):根据服务id获取ILoadBalancer,而ILoadBalancer会拿着服务id去eureka中获取服务列表并保存起来。
  • getServer(loadBalancer):利用内置的负载均衡算法,从服务列表中选择一个。本例中,可以看到获取了8082端口的服务

放行后,再次访问并跟踪,发现获取的是8081:

实现了负载均衡

负载均衡策略IRule

在刚才的代码中,可以看到获取服务使通过一个getServer方法来做负载均衡:

继续跟入:

继续跟踪源码chooseServer方法,发现这么一段代码:

我们看看这个rule是谁:

这里的rule默认值是一个RoundRobinRule,看类的介绍:

RoundRobin:轮询。也就是实现了负载均衡

总结

SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。

基本流程如下:

  • 拦截我们的RestTemplate请求http://userservice/user/1
  • RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
  • DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
  • eureka返回列表,localhost:8081、localhost:8082
  • IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
  • RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求

4.3 负载均衡策略

负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:

不同规则的含义:

默认的实现就是ZoneAvoidanceRule,是一种轮询方案

通过自定义IRule实现可以修改负载均衡规则,有两种方式:

方式一:代码方式:在order-service中的OrderApplication类中,定义一个新的IRule(所有的服务都执行)

java 复制代码
@Bean
public IRule randomRule(){
    return new RandomRule();
}

方式二:配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则(针对某个服务)

yaml 复制代码
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

注意:一般用默认的负载均衡规则,不做修改。

4.4 饥饿加载

Ribbon默认是采用懒加载 ,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。

而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

yaml 复制代码
ribbon:
  eager-load:
    enabled: true
    clients: userservice
    # 如果有多个使用这种写法
    # clients:
    #  - userservice
    #  - xxxxservice

5 Nacos注册中心

国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。

5.1.认识和安装Nacos

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

在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
GitHub主页GitHub的Release下载页

5.1.1 Windows下安装Nacos

下载后解压到一个非中文路径下:

  1. 端口配置

    acos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。如果无法关闭占用8848端口的进程 ,也可以进入nacos的conf目录,修改配置文件中的端口:

  2. 启动

    进入bin目录,结构如下:

    然后执行命令:startup.cmd -m standalone

    执行成功后:

  3. 访问

    启动后,在浏览器输入地址:http://127.0.0.1:8848/nacos即可,默认账号和密码都是nacos

5.1.2 Linux下安装Nacos

  1. 安装JDK
    Nacos依赖于JDK运行,所以Linux上也需要安装JDK才行。

    上传到某个目录,例如:/usr/local/

然后解压缩:

sh 复制代码
tar -xvf jdk-8u144-linux-x64.tar.gz

然后重命名为java

配置环境变量:

sh 复制代码
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin

设置环境变量:

sh 复制代码
source /etc/profile
  1. 上传安装包
    上传到Linux服务器的某个目录,例如/usr/local/src目录下:
  2. 解压

命令解压缩安装包:

sh 复制代码
tar -xvf nacos-server-1.4.1.tar.gz

然后删除安装包:

sh 复制代码
rm -rf nacos-server-1.4.1.tar.gz
  1. 端口配置

与windows中类似

  1. 启动,在nacos/bin目录中,输入命令启动Nacos:
sh 复制代码
sh startup.sh -m standalone

5.2 服务注册到nacos

Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册、服务发现规范。因此使用Nacos和使用Eureka对于微服务来说,并没有太大区别。

主要差异在于:

  • 依赖不同
  • 服务地址不同
  1. 引入依赖
    在cloud-demo父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依赖:
xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.6.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:

xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 配置nacos
    在user-service和order-service的application.yml中添加nacos地址:
yaml 复制代码
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
  1. 重启
    重启微服务后,登录nacos管理页面,可以看到微服务信息:

5.3 服务分级存储模型

一个服务 可以有多个实例,例如我们的user-service,可以有:

  • 127.0.0.1:8081
  • 127.0.0.1:8082
  • 127.0.0.1:8083

假如这些实例分布于全国各地的不同机房,例如:

  • 127.0.0.1:8081,在上海机房
  • 127.0.0.1:8082,在上海机房
  • 127.0.0.1:8083,在杭州机房

Nacos就将同一机房内的实例 划分为一个集群

也就是说,user-service是服务,一个服务可以包含多个集群,如杭州、上海,每个集群下可以有多个实例,形成分级模型,如图:

微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如:

杭州机房内的order-service应该优先访问同机房的user-service。

5.3.1 给user-service配置集群

修改user-service的application.yml文件,添加集群配置:

yaml 复制代码
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称

重启两个user-service实例后,我们可以在nacos控制台看到下面结果:

再次复制一个user-service启动配置,添加属性:

启动UserApplication3后再次查看nacos控制台:

5.3.2 同集群优先的负载均衡

默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。

1)给order-service配置集群信息,修改order-service的application.yml文件,添加集群配置:

yaml 复制代码
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称

2)修改负载均衡规则,修改order-service的application.yml文件,修改负载均衡规则:

yaml 复制代码
userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 

5.4 权重配置

实际部署中会出现这样的场景:

服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。

默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题

因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。

在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:

如果权重修改为0,则该实例永远不会被访问

5.5 环境隔离

Nacos提供了namespace来实现环境隔离功能。

  • nacos中可以有多个namespace
  • namespace下可以有group、service等
  • 不同namespace之间相互隔离,例如不同namespace的服务互相不可见

5.5.1 创建namespace

默认情况下,所有service、data、group都在同一个namespace,名为public:

我们可以点击页面新增按钮,添加一个namespace

如果不设置id则通过uuid自动生成

就能在页面看到一个新的namespace:

5.5.2 给微服务配置namespace

给微服务配置namespace只能通过修改配置来实现。

例如,修改order-service的application.yml文件:

yaml 复制代码
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID

此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错:

5.6.Nacos与Eureka的区别

Nacos的服务实例分为两种l类型:

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。
    配置一个服务实例为永久实例:
yaml 复制代码
spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:

  • Nacos与eureka的共同点

    • 都支持服务注册和服务拉取
    • 都支持服务提供者心跳方式做健康检测
  • Nacos与Eureka的区别

    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
相关推荐
鸽鸽程序猿4 小时前
【JavaEE】【SpringCloud】注册中心_nacos
java·spring cloud·java-ee
递归尽头是星辰6 小时前
Spring Cloud Alibaba 核心理论体系:Nacos、Sentinel、Seata深度解析
spring cloud·nacos·sentinel·seata·微服务治理
lpfasd1236 小时前
springcloud docker 部署问题排查与解决方案
spring·spring cloud·docker
蓝眸少年CY8 小时前
(第七篇)spring cloud之Hystrix断路器
spring·spring cloud·hystrix
蓝眸少年CY10 小时前
(第八篇)spring cloud之zuul路由网关
后端·spring·spring cloud
码出财富1 天前
SpringBoot 内置的 20 个高效工具类
java·spring boot·spring cloud·java-ee
daladongba1 天前
Spring Cloud Gateway
java·spring cloud·gateway
梁bk1 天前
[spring cloud] Seata分布式事务管理
分布式·spring·spring cloud
张二狗和苗翠花1 天前
Spring Cloud Nacos + @RefreshScope + @Value实现配置项动态刷新
spring·spring cloud
MoFe11 天前
【Docker】windows系统wsl如何操作DOCKER
云原生·eureka