iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何解决Spring Cloud 服务冲突问题
  • 118
分享到

如何解决Spring Cloud 服务冲突问题

2023-06-04 07:06:16 118人浏览 薄情痞子
摘要

本篇文章为大家展示了如何解决spring cloud 服务冲突问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、背景在我们开发微服务架构系统时,虽然说每个微服务都是孤立的可以单独开发,但实际上并

本篇文章为大家展示了如何解决spring cloud 服务冲突问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一、背景

在我们开发微服务架构系统时,虽然说每个微服务都是孤立的可以单独开发,但实际上并非如此,要调试和测试你的服务不仅需要您的微服务启动和运行,还需要它的上下文服务、依赖的基础服务等都要运行;但如果你的系统服务数和依赖比较多呢,那就是一个比较棘手的问题!有没有办法能提高开发效率呢?

如何解决Spring Cloud 服务冲突问题

如上图所示,我们能不能用服务器把所有的服务都部署起来,然后开发只在本地运行自己所负责开发的服务,因为需要依赖其他服务所以本地启动的服务也需要注册到公共的注册中心里;

例子中业务服务B有3台实例注册到注册中心里

分别是:服务上的、开发A与开发B自己本机启动的

但是这样做又会出现新的问题:服务会冲突乱窜,意思就是开发A在debug自己的业务服务B服务的时候可能请求会跳转到其他人的实例上(服务器、开发B)

二、解决思路

解决这个服务乱窜问题有一个比较优雅的方式就是自定义负载均衡规则,主要实现以下目标:

  1. 普通用户访问服务器上的页面时,请求的所有路由只调用服务器上的实例

  2. 开发A访问时,请求的所有路由优先调用开发A本机启动的实例,如果没有则调用服务器上的实例

  3. 开发B访问时同上,请求的所有路由优先调用开发B本机启动的实例,如果没有则调用服务器上的实例

三、具体实现

要实现上面的目标有两个比较关键的问题需要解决

  1. 区分不同用户的服务实例

  2. 实现自定义负载均衡规则

1. 区分不同用户的服务实例

直接使用注册中心的元数据(metadata)来区分就可以了

主流的注册中心都带有元数据管理

Nacos为例,只需要在配置文件下添加

spring: cloud: nacos: discovery: server-addr: localhost:8848 metadata: version: zlt

metadata下的version就是我添加的元数据key为version,value为zlt

启动服务后元数据就会注册上去,如下图

如何解决Spring Cloud 服务冲突问题

经过元数据区分后,目前是下面这个情况

  • 服务器的实例version为空

  • 开发人员自己本地启动的实例version为唯一标识(自己的名字)

如何解决Spring Cloud 服务冲突问题

2. 自定义负载均衡规则

首先在Spring Cloud微服务框架里实例的负载均衡是由Ribbon负责。

CustomIsolationRule详细类信息可查看:CustomIsolationRule.java

public class CustomIsolationRule extends RoundRobinRule {  @Override public Server choose(ILoadBalancer lb, Object key) { if (lb == null) { return null; } String version = LbIsolationContextHolder.getVersion(); List<Server> targetList = null; List<Server> upList = lb.getReachableServers(); if (StrUtil.isNotEmpty(version)) { //取指定版本号的实例 targetList = upList.stream().filter( server -> version.equals( ((NacosServer) server).getMetadata().get(CommonConstant.METADATA_VERSION) ) ).collect(Collectors.toList()); } if (CollUtil.isEmpty(targetList)) { //只取无版本号的实例 targetList = upList.stream().filter( server -> { String metadataVersion = ((NacosServer) server).getMetadata().get(CommonConstant.METADATA_VERSION); return StrUtil.isEmpty(metadataVersion); } ).collect(Collectors.toList()); } if (CollUtil.isNotEmpty(targetList)) { return getServer(targetList); } return super.choose(lb, key); }  private Server getServer(List<Server> upList) { int nextInt = RandomUtil.randomInt(upList.size()); return upList.get(nextInt); }}

集成轮询规则RoundRobinRule来实现,主要的逻辑为

  • 根据上游输入的版本号version,有值的话则取服务元信息中version值一样的实例

  • 上游的版本号version没值或者该版本号匹配不到任何服务,则只取服务元信息中version值为空的实例

并通过配置开关控制是否开启自定义负载规则

@Configuration@ConditionalOnProperty(value = "zlt.ribbon.isolation.enabled", havingValue = "true")@RibbonClients(defaultConfiguration = {RuleConfigure.class})public class LbIsolationConfig {}

四、总结

上面提到的区分服务实例和自定义负载规则为整个解决思路的核心点,基本实现了服务实例的隔离,剩下要做的就是上游的version怎样传递呢?,下面我提供两个思路

  • 开发人员自己启动前端工程,通过配置参数,统一在前端工程传递version

  • 通过postman调用接口的时候在header参数中添加

如何解决Spring Cloud 服务冲突问题

上述内容就是如何解决Spring Cloud 服务冲突问题,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何解决Spring Cloud 服务冲突问题

本文链接: https://www.lsjlt.com/news/236779.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决Spring Cloud 服务冲突问题
    本篇文章为大家展示了如何解决Spring Cloud 服务冲突问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、背景在我们开发微服务架构系统时,虽然说每个微服务都是孤立的可以单独开发,但实际上并...
    99+
    2023-06-04
  • 如何解决gateway与spring-boot-starter-web冲突问题
    本篇内容介绍了“如何解决gateway与spring-boot-starter-web冲突问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2023-06-20
  • maven冲突依赖问题如何解决
    Maven冲突依赖问题可以通过以下方法解决: 使用`mvn dependency:tree`命令查看项目的依赖树,找到冲突的依赖...
    99+
    2023-10-27
    maven
  • 如何解决css样式冲突问题
    本篇内容主要讲解“如何解决css样式冲突问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决css样式冲突问题”吧! 解决方法...
    99+
    2024-04-02
  • React样式冲突解决问题如何解决
    本篇内容主要讲解“React样式冲突解决问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React样式冲突解决问题如何解决”吧!前言:React最终编译打包后都在一个html页面中,如...
    99+
    2023-07-05
  • git提交冲突问题如何解决
    解决 Git 提交冲突问题一般有以下几个步骤: 确定冲突的文件:在使用 Git 进行提交时,可能会出现冲突的文件。使用 `git...
    99+
    2023-10-26
    git
  • gateway与spring-boot-starter-web冲突问题的解决
    gateway与spring-boot-starter-web 冲突 环境: SpringCloud 版本 ---- Finchley.SR2 SpringBoot 版本 ---- ...
    99+
    2024-04-02
  • css样式冲突的问题如何解决
    本篇内容介绍了“css样式冲突的问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、 细化选择符通过使用组合器(Combinato...
    99+
    2023-06-20
  • mysql主键冲突的问题如何解决
    本篇内容介绍了“mysql主键冲突的问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明忽略冲突保留原始记录。冲突更新冲突后部分字...
    99+
    2023-06-20
  • ubuntu双网卡冲突问题如何解决
    要解决Ubuntu双网卡冲突问题,可以尝试以下步骤:1. 确定冲突:使用命令`ifconfig`或`ip addr`查看当前系统中的...
    99+
    2023-10-10
    ubuntu
  • 如何解决docker与vmware的冲突问题
    这篇文章给大家分享的是有关如何解决docker与vmware的冲突问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、docker启动问题:问题解决:需要开启Hyper-V,(开启方法:控制面板->程序-...
    99+
    2023-06-14
  • 如何解决springboot-启动bean冲突问题
    小编给大家分享一下如何解决springboot-启动bean冲突问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!启动bean冲突在一次启动中遇到了bean冲突的问题,提示存在两个名称重复的beanorg.springfr...
    99+
    2023-06-29
  • 怎么解决Maven冲突问题
    这篇文章主要介绍“怎么解决Maven冲突问题”,在日常操作中,相信很多人在怎么解决Maven冲突问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决Maven冲突问题”...
    99+
    2024-04-02
  • 如何定位、解决maven依赖冲突问题
    目录 1.依赖冲突的原因 2.复现一个依赖冲突场景 3.如何定位依赖冲突 3.1.maven show dependencies 3.2.maven helper 4.依赖路径最短优先原则 1.依赖冲突的原因 如果maven项目中,A依...
    99+
    2023-09-03
    算法 linux 前端 原力计划
  • mac上ip地址冲突问题如何解决
    在Mac上解决IP地址冲突问题,您可以尝试以下几种方法:1. 重启网络设备:首先,您可以尝试重启您的路由器、交换机或其他网络设备。有...
    99+
    2023-10-10
    mac
  • VSCode中Eslint和Prettier冲突问题如何解决
    这篇文章主要讲解了“VSCode中Eslint和Prettier冲突问题如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VSCode中Eslint和Prettier冲突问题如何解决”吧...
    99+
    2023-07-05
  • 如何解决共享资源的访问冲突问题?
    php小编草莓将为您介绍如何解决共享资源的访问冲突问题。在多线程或多进程编程中,当多个线程或进程同时访问共享资源时,可能会导致数据不一致或错误的结果。为了解决这个问题,可以使用互斥锁、...
    99+
    2024-02-10
    同步机制
  • 解决docker与vmware的冲突问题
    1、docker启动问题: 问题解决: 需要开启Hyper-V,(开启方法:控制面板->程序->程序和功能->启动或关闭Windows功能,然后再重新启动电脑) ...
    99+
    2024-04-02
  • 如何解决Spring JPA 使用@transaction注解时产生CGLIB代理冲突问题
    本篇内容介绍了“如何解决Spring JPA 使用@transaction注解时产生CGLIB代理冲突问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2023-06-20
  • jQuery命名冲突问题怎么解决
    这篇文章主要介绍“jQuery命名冲突问题怎么解决”,在日常操作中,相信很多人在jQuery命名冲突问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jQuery命名...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作