Eureka详解系列(二)–如何使用Eureka(原生API,无Spring)

简介

通过上一篇博客 Eureka详解系列(一)–先谈谈负载均衡器 ,我们知道了 Eureka 是什么以及为什么要使用它,今天,我们开始研究如何使用 Eureka。

在此之前,先说明一点。网上几乎所有关于 Eureka 的文章都是基于 Spring 的,但 本文的例子不会有任何 Spring 的代码,我尽量使用 Eureka 原生的 API,后面的源码分析也是如此。因为 Spring 把 Eureka 藏得越好,我们研究起来就会越困难,毕竟我写这个系列不是只为了学会怎么使用 Eureka,我们还要分析它的源码。当然,实际项目中就没必要这么搞了。

另外,这只是一个简单的例子,只配置了几个必备的参数,下篇博客会展开分析。

项目环境

os:win 10

jdk:1.8.0_231

eureka:1.10.11

tomcat:9.0.21

maven:3.6.3

使用例子

如何设计例子

通过 Eureka 的结构图可以知道,我们需要分别搭建 Eureka Server、Eureka Client for application service、Eureka Client for application client 三个模块。

Eureka详解系列(二)--如何使用Eureka(原生API,无Spring)

我参考了官网的例子,并做了一点小改动,代码和配置就不一一列出了,具体源码见文末链接。

Eureka详解系列(二)--如何使用Eureka(原生API,无Spring)
  1. eureka-server:作为 Eureka Server,它是一个独立的 Web 服务,能够处理 Eureka Client 的 rest 请求:注册、续约、注销服务,以及获取服务的信息。它需要打包成 war 包运行在 tomcat 上。
  2. eureka-service:作为 application service,它需要向 Eureka Server 注册自己,并监听 Eureka Client 的消费请求。
  3. eureka-client:作为 application client,它需要从 Eureka Server 获取 application service 的地址,然后访问 application service。

如何运行例子

我们需要按照顺序运行它们。

eureka-server

eureka-server 使用 jersey 作 Web 框架(jersey 和 struts2、springMVC 作用差不多,没接触过也不碍事),项目最终要打包成 war 包运行在 tomcat 上。项目的运行方法如下:

  1. 构建项目。使用 mvn clean package将项目打包成 eureka.war。
  2. 将 eureka.war 拷贝到 ${CATALINA_HOME}/webapps 目录下。
  3. 启动 tomcat。通过http://127.0.0.1:8080/eureka/ 可以访问成功,这个时候,我们就可以使用 Eureka Client 往上面注册服务了。另外,我们可以看到,Eureka Server 将自己注册了上去(30s 内)。

Eureka详解系列(二)--如何使用Eureka(原生API,无Spring)

补充一点,官方提供了基于 java 实现的 Eureka Client 来与 Eureka Server 进行交互,其实,我们也可以直接使用 rest 请求,例如,通过 http://127.0.0.1:8080/eureka/v2/apps 可以获取所有的服务列表。当我们的客户端不支持 java 时,这些接口将非常有用,具体接口可以参考官网。在项目中,我们查找包含 javax.ws.rs.Path注解的类,也可以找到这些接口。

eureka-service

eureka-service 的实现比较简单,它先把自己注册到 Eureka Server,然后一直监听 application client 的消费,监听到后,只进行简单的交互后就直接关闭客户端。代码简化如下:

// 创建ApplicationInfoManager对象(用来注册、注销当前实例)
ApplicationInfoManager applicationInfoManager = new ApplicationInfoManager(
    new MyDataCenterInstanceConfig(), new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get());
// 创建EurekaClient对象(用来获取其他服务以及提供内部入口用来注册、续约、和注销当前实例)
EurekaClient eurekaClient = new DiscoveryClient(applicationInfoManager, new DefaultEurekaClientConfig());
// 设置当前实例状态为STARTING
applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.STARTING);
// 设置当前实例状态为UP
applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.UP);
// 和application client交互
// ······
// 关闭客户端,同时也会注销当前实例
eurekaClient.shutdown();

操作方法很简单,只要运行 ExampleEurekaService.main方法就行(加上启动参数: -Deureka.client.props=sample-eureka-service)。当控制台出现”Service started and ready to process requests..“时,说明当前实例已经注册到 Eureka Server,并且准备被消费。

Eureka详解系列(二)--如何使用Eureka(原生API,无Spring)

eureka-client

eureka-client 项目的具体逻辑为:从 Eureka Server 上获取到注册表,然后和 application service 交互,得到响应后直接关闭客户端。代码简化如下:

// 创建ApplicationInfoManager对象(用来注册、注销当前实例)
ApplicationInfoManager applicationInfoManager = new ApplicationInfoManager(
    new MyDataCenterInstanceConfig(), new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get());
// 创建EurekaClient对象(用来获取其他服务以及提供内部入口用来注册、续约、和注销当前实例)
EurekaClient eurekaClient = new DiscoveryClient(applicationInfoManager, new DefaultEurekaClientConfig());
// 获取指定服务的实例对象
InstanceInfo nextServerInfo = eurekaClient.getNextServerFromEureka(vipAddress, false);
// 和application service交互
// ······
// 关闭客户端
eurekaClient.shutdown();

直接运行 ExampleEurekaClient.main就行(加上启动参数 -Deureka.client.props=sample-eureka-client)。我们可以从控制台看到整个过程。

Eureka详解系列(二)--如何使用Eureka(原生API,无Spring)

以上,通过一个简单的例子,我们实现了将服务注册到 Eureka Server 以及正常地消费它。这是非常”入门级”的例子,下篇博客我们再深入研究各种配置参数的作用。

最后,感谢阅读。

参考资料

https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance

相关源码请移步:https://github.com/ZhangZiSheng001/eureka-demo

本文为原创文章,转载请附上原文出处链接:https://www.cnblogs.com/ZhangZiSheng001/p/14337985.html

Original: https://www.cnblogs.com/ZhangZiSheng001/p/14337985.html
Author: 子月生
Title: Eureka详解系列(二)–如何使用Eureka(原生API,无Spring)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/575800/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python–socket

    socket网络编程:socket、socketserver socket:{server,client} socket_server示例: socket_client示例: 应用…

    数据库 2023年6月9日
    076
  • (面试)大型网站应用之海量数据、高并发解决方案

    面试时会遇到这样的提问,就记录下来,加深印象;以后工作中也可以用到。 海量数据的解决方案: 网站访问数据的特点大多数呈现为”二八定律”:80%的业务访问集中…

    数据库 2023年6月11日
    053
  • 管理控制台权限控制

    本文讨论一种常见的访问控制方法: [En] This article discusses a common way of access control: 数据授权: 角色 + 接口…

    数据库 2023年5月24日
    074
  • MySql 删除数据表

    定义: 删除数据表就是删除数据库中已经存在的表。请注意,当表被删除时,表的定义和表中的所有数据都将被删除。因此,在执行删除操作之前,最好对表中的数据进行备份,以避免无法挽回的后果。…

    数据库 2023年5月24日
    087
  • 16 两个对象值相同(x.equals(y) == true),但却可以有不同的hashCode,这句话对不对?

    不对,如果两个对象x和y满足x.equals(y) == true,那么他们的哈希码应该相同。 根据hashCode方法协定:在每个重写了equals方法的类中,必须重写hashC…

    数据库 2023年6月6日
    080
  • Python:如何只用十几行代码写一个程序?

    Python可以做的事情真的太多了,常见的网站开发,软件开发,爬虫,数据分析,人工智能,机器学习,量化投资,自动化办公,自动化运维,游戏开发,脚本制作,树莓派等等等等~ 今天咱们就…

    数据库 2023年6月14日
    083
  • Python–模块Module

    1、定义模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件,(文件名:test.py,对应的模块名test)包:用来…

    数据库 2023年6月9日
    084
  • mysql常用语句 4 + mysql的约束(非空,唯一,主键,外键)

    1.更新语句update dept1 set loc = ‘wz’,dname = ‘xueshenghui’ where dept…

    数据库 2023年5月24日
    082
  • CSS速学!!

    padding:内边距 缩写:缩写: padding:值; 上下左右的内边距一样 padding:值1 值2; 值1代表上下内边距,值2代表左右内边距 padding:值1 值2 …

    数据库 2023年6月16日
    077
  • 千万级别的表分页查询非常慢,怎么办?

    一、问题复现 在实际的软件系统开发过程中,随着使用的用户群体越来越多,表数据也会随着时间的推移,单表的数据量会越来越大。 以订单表为例,假如每天的订单量在 4 万左右,那么一个月的…

    数据库 2023年6月14日
    090
  • Python–生成器

    学习生成器之前,首先需要认识列表生成式,直奔主题。 1、简单列表生成式示例: 看样子好像很NB的样子,其实它等价于: 其实还是有点NB的,毕竟代码少了,手动嘻嘻嘻! 2、削微高级点…

    数据库 2023年6月9日
    0131
  • Django后台美化

    Django后台美化 1.Xadmin 1.1 安装 通过如下命令安装xadmin的最新版: pip install https://github.com/sshwsfc/xadm…

    数据库 2023年6月14日
    093
  • 自定义表单 Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器

    特别注意:本代码为 Springboot 工作流 前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.3.0+ Flowable6.5.0+ my…

    数据库 2023年6月6日
    0122
  • 08 聚集函数

    聚集函数count max min sum avgcount(*)会统计null行,count列名则不会 分组group by 过滤分组havingwhere能做的having都能…

    数据库 2023年6月16日
    095
  • 设计模式之(7)——装饰设计模式

    定义:装饰设计模式允许向一个现有的对象添加功能,而不改变其结构(这就很符合程序设计的” 开闭原则“),重点突出类功能的增强,属于结构型创建模式,这种模式创建…

    数据库 2023年6月14日
    080
  • Pod控制器类型

    Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删除…

    数据库 2023年6月14日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球