首页 > 其他分享 >Eureka使用技巧: 服务间调用时,巧妙利用zone,指定要调用哪个实例

Eureka使用技巧: 服务间调用时,巧妙利用zone,指定要调用哪个实例

时间:2024-01-30 21:36:02浏览次数:29  
标签:count 调用 zone 0.0 resp Eureka 实例 time

问题描述

Spring Cloud架构下,我们在开发时,一般会搭建一个测试的Eureka Server,多个工程师的应用,都往这个Server进行注册。
现有有A、B两个service,A要调用B。
B有两个实例,一个是我开发的,另外一个是张三同学开发的。
我在B上新开发了几个接口,因此我就想让A只请求我开发的B服务。怎么办呢?

解决办法:

我在启动B服务时,增加配置:

eureka:
  client:
    service-url:
      defaultZone: http://xxx:12000/eureka
  instance:
    prefer-ip-address: true
    status-page-url-path: /swagger-ui.html
    metadata-map:
      zone: xushengbin

在metadata-map中增加zone标签,值就是我的名字。

我在启动A服务时,增加同样的zone标签(配置同上)。

这样,相当于我指定了,我开发的A、B两个服务都在同一个zone(机房的意思),而张三开发的B服务未指定机房。
Spring Cloud是利用ribbon做负载均衡,A请求B时,ribbon会优先取同机房的实例(如果同机房没有可用实例,才会请求其他机房的实例)。
因此呢,这样配置之后,A就之后请求我开发的B服务的实例。

A请求B时,我们看下日志信息:

{NFLoadBalancer:name=entity,current list of Servers=[192.168.0.142:10011],Load balancer stats=Zone stats: {xushengbin=[Zone:xushengbin;	Instance count:1;	Active connections count: 0;	Circuit breaker tripped count: 0;	Active connections per server: 0.0;]
},Server stats: [[Server:192.168.0.142:10011;	Zone:xushengbin;	Total Requests:0;	Successive connection failure:0;	Total blackout seconds:0;	Last connection made:Thu Jan 01 08:00:00 CST 1970;	First connection made: Thu Jan 01 08:00:00 CST 1970;	Active Connections:0;	total failure count in last (1000) msecs:0;	average resp time:0.0;	90 percentile resp time:0.0;	95 percentile resp time:0.0;	min resp time:0.0;	max resp time:0.0;	stddev resp time:0.0]
]}

获取到的server list,只包含zone为xushengbin的实例(不包含张三同学的实例)。

此时,如果我停掉我开发的B服务的实例,B服务只剩下张三的实例,看下日志:

{NFLoadBalancer:name=entity,current list of Servers=[192.168.0.110:10001],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;	Instance count:1;	Active connections count: 0;	Circuit breaker tripped count: 0;	Active connections per server: 0.0;]
},Server stats: [[Server:192.168.0.110:10001;	Zone:defaultZone;	Total Requests:0;	Successive connection failure:0;	Total blackout seconds:0;	Last connection made:Thu Jan 01 08:00:00 CST 1970;	First connection made: Thu Jan 01 08:00:00 CST 1970;	Active Connections:0;	total failure count in last (1000) msecs:0;	average resp time:0.0;	90 percentile resp time:0.0;	95 percentile resp time:0.0;	min resp time:0.0;	max resp time:0.0;	stddev resp time:0.0]
]}

此时返回的就是defaultzone的实例,也就是张三同学的实例。

总结

用好Eureka提供的zone、region功能,用处很大。
image
目前能想到的场景:
1、搭建Spring Cloud测试环境时,如果要在测试环境部署所有的service,代价可能比较大。这时候就可以采取这样的路由策略:
如果一个service在测试环境有可用实例,就访问它。如果没有,就访问生产环境的实例。
操作方法:

  • 测试环境搭建单独的网关(zuul),标记zone:test
  • 给所有测试环境的service标记zone:test
    假如流量是网关 -> A -> B, 网关请求A时,会优先选择部署在test区域的A实例,A请求B时也会优先选择部署在test区域的B实例。

2、对于提供SaaS服务的公司,一些政府客户会要求私有化部署。如果所有服务都私有化部署的话,后期维护、更新成本会很高。这时候就可以偷懒一下,只对特定的几个服务进行私有化部署,其他未部署的服务让流量到公有云平台。(只是不成熟的设想,网络问题很难解决)

操作方式:

  • 私有云、公有云分布部署一个Eureka Server,私有云Eureka作为公有云的Peer,也就是说,注册到公有云的服务,都会同步到私有云的注册中心。
    这时候,私有云的Java Service,在请求其他服务时,就会优先找私有云上部署的实例,找不到再请求公有云的实例。

标签:count,调用,zone,0.0,resp,Eureka,实例,time
From: https://www.cnblogs.com/xushengbin/p/17988551

相关文章

  • 调用微信退款时退款原因填写为空的问题
    问题输入源“/body/reason”映射到值字段“退款原因”字符串规则校验失败,字符数0,小于最小值1在调用微信退款时,遇到以上的问题,具体原因为:文档上退款原因为选填,我们可以填null,但不能是空字符串。参考微信官方文档-申请退款......
  • 利用pyautogui调用微信ocr
    importpyautoguiimporttimedefocrweixin(filename):#鼠标点击,默认左键#移至sheet页pyautogui.click(1386,33)#点击地址框pyautogui.click(1364,94)pyautogui.hotkey('ctrl','a')time.sleep(0.5)pyautogui.typewrite(......
  • Python调用微信OCR识别文字和坐标
    python的ocr识别最方便的最准确的方法就是直接调微信的ocr注意:调用的时候先把微信关掉。importosimportjsonimporttimefromwechat_ocr.ocr_managerimportOcrManager,OCR_MAX_TASK_IDwechat_ocr_dir=r"C:\Users\mydell\AppData\Roaming\Tencent\WeChat\XPlugin\P......
  • websocket客户端类,工具类中调用到service层去
    maven<dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency>代码@Slf4j@ComponentpublicclassWESWebSocketClientexten......
  • 上一任留下的 Eureka,我该如何提升她的性能和稳定性(含数据比对)?
    作者:聪言开篇:一次小小的技术讨论周末的时候,和一位在国内某互联网公司负责运维的朋友聊天,由于工作相关,刚好聊到了公司项目中微服务架构这块的一些问题,他们公司的微服务架构使用的是业界比较常用的SpringCloudNetflix那一套作为底座,有专门的同学负责运维一套自建的Eureka集群来......
  • Apipost中API如何调用本地文件
    近期版本更新中Apipost推出插件管理,可以直接在预、后执行脚本中调用本地的脚本文件导入脚本在「系统设置」—「插件管理」中打开目录将要执行的脚本文件拖入到文件夹下 执行脚本需要获取请求参数:constrequestData=request.request_bodys;在预、后执行脚本输入框中输入......
  • C# 使用自定义特性标注类的方法,直接在当前类中让Main函数调用它
    有的时候我们想要再Main执行一些代码,如果直接在里面写的话,下次再想用的时候就会把之前的代码删掉,好不容易写的代码不想删掉于是我们可以将这些代码写到类文件中,想要执行了,就在Main中调用该类的方法,但是有的时候我们又懒的去Main函数指定的,有没有什么办法能直接在新类中就能指定......
  • 解决MySQL设置时区时的错误Unknown or incorrect time zone: 'Asia/Shanghai'
    问题描述:在trino中配置了mysql.properties文件,但是通过trino客户端,执行命令showschemasfrommysql;查看数据库信息时报错:Errorlistingschemasforcatalogmysql:java.sql.SQLNonTransientConnectionException:Couldnotcreateconnectiontodatabaseserver.Attempted......
  • 在Python中,子类继承父类并调用父类的构造方法有几种方式: 1. 如果子类没有重写`__init
    在Python中,子类继承父类并调用父类的构造方法有几种方式:1.如果子类没有重写`__init__`,实例化子类时,会自动调用父类定义的`__init__`¹。```pythonclassFather(object):  def__init__(self,name):    self.name=nameclassSon(Father):  passson=So......
  • eureka注册中心的使用
    一、新建eureka项目选择spring-web、eureka-server两个服务二、检查maven依赖<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"......