版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章SpringCloud快速入门学习目标了解Eureka服务注册与发现。掌握EurekaServer和EurekaClient的搭建方法。了解微服务之间的交互方式。通过第8章,我们了解Eureka是Netflix公司开发的SpringCloud的核心组件之一,本章我们来详细介绍一下它的服务注册与发现机制,并搭建基础的微服务。Eureka服务注册与发现12搭建EurekaServer服务注册中心3搭建EurekaClient商品微服务4搭建EurekaClient订单微服务5微服务之间的交互-FeignEureka服务注册与发现Eureka分为EurekaServer和EurekaClient,以实现服务注册以及服务发现的功能。当其是EurekaServer时,便是服务端,也叫服务注册中心,所有的客户端会向其注册。注册中心的服务注册表中将会存储所有可用服务节点的信息,服务节点信息可以通过访问注册中心直观地查看。当其是EurekaClient时,便是客户端,也叫实例,可以向注册中心将自己注册进去,也可以从注册中心获取其他实例的服务信息。EurekaClient启动后,会向EurekaServer发送心跳进行服务续约,默认30s发送一次心跳,告诉EurekaServer“我还活着”,防止EurekaServer将它从服务注册表中移除。如果EurekaServer在多个心跳周期(默认为90s)内没有接收到某个服务的心跳,便会从服务注册表中把相应的服务节点移除。EurekaClient还具有缓存功能,即当EurekaClient注册到EurekaServer时,彼此会进行数据同步,也就是EurekaClient会缓存一份EurekaServer中的服务信息列表。Eureka服务注册与发现当需要调用服务的时候,EurekaClient会从自己缓存的服务注册表中去检索对应的服务信息,当需要调用的服务不可用时才会从注册中心获取。Eureka通过心跳检查和缓存更新机制,不仅可提高性能,也使系统具有高可用性。因为即便EurekaServer宕机,也依然可以利用缓存中的信息调用服务。因为服务之间可以互相调用,所以EurekaClient分为两种角色,分别是服务提供者和服务消费者。服务提供者通过向注册中心发送心跳进行服务续约,使得服务消费者能够通过从注册中心获取到的最新可用服务列表来调用相应的服务。很多情况下,EurekaClient既是服务提供者,供其他服务调用;同时也是服务消费者,通过调用其他服务实现业务功能。Eureka服务注册与发现12搭建EurekaServer服务注册中心3搭建EurekaClient商品微服务4搭建EurekaClient订单微服务5微服务之间的交互-Feign搭建EurekaServer服务注册中心了解了Eureka的作用之后,我们搭建一个EurekaServer注册中心。我们使用IDEA创建一个名为eureka-server的SpringBoot项目,如图9-1所示。然后,在“dependencies”界面中勾选“SpringCloudDiscovery”中的“EurekaServer”,如图9-2所示。搭建EurekaServer服务注册中心创建好后,项目自动生成的配置文件为“perties”。为了方便,我们使用YAML配置方式,只需要将配置文件扩展名改成“.yml”即可。然后在application.yml中写入eureka-server配置,如程序清单9-1所示。server.port配置服务的端口号为7000,spring.application.name配置服务的名称为eureka-server。register-with-eureka表示是否向EurekaServer注册,这里需要设置为false,因为它自己就是EurekaServer,不需要向自己注册。fetch-registry表示是否从EurekaServer获取注册信息,同理也要设置为false。service-url.defaultZone表示注册中心地址,其中${server.port}对应上方设置的服务端口号。搭建EurekaServer服务注册中心然后,在项目启动类EurekaServerApplication上添加@EnableEurekaServer注解开启EurekaServer,如程序清单9-2所示。最后,我们启动项目,在浏览器中访问eureka-server,如图9-3所示。通过这个页面,我们可以看到注册的服务列表以及运行情况。当然,由于现在EurekaServer上没有注册任何EurekaClient,所以中间的实例列表提示信息为“Noinstancesavailable”。搭建EurekaServer服务注册中心Eureka服务注册与发现12搭建EurekaServer服务注册中心3搭建EurekaClient商品微服务4搭建EurekaClient订单微服务5微服务之间的交互-Feign搭建EurekaClient商品微服务在9.2节中我们搭建好了EurekaServer,本节我们来搭建一个EurekaClient商品(goods)微服务,实现简单的查询商品的功能。我们使用IDEA创建一个名为goods的SpringBoot项目,如图9-4所示。然后,在“dependencies”界面中勾选“Web”中的“SpringWeb”,如图9-5所示;还要勾选“SpringCloudDiscovery”中的“EurekaDiscoveryClient”,如图9-6所示。搭建EurekaClient商品微服务搭建EurekaClient商品微服务创建好后,同样地,我们先将配置文件扩展名改成“.yml”。然后在application.yml中写入配置,如程序清单9-3所示。server.port配置服务的端口号为7001,配置服务的名称为goods。service-url.defaultZone表示注册中心地址,和9.2节我们创建的eureka-server中的注册中心地址一样。搭建EurekaClient商品微服务然后,在项目启动类GoodsApplication上添加@EnableEurekaClient注解开启EurekaClient,如程序清单9-4所示。接着,我们创建好图9-7所示的商品微服务结构,来实现简单的商品查询功能。Controller表示接口层,用于响应HTTP请求。Entity用于存放实体类,我们创建了一个名为Goods的商品类。service表示服务层,controller通过调用service实现功能。impl中是服务层的实现。搭建EurekaClient商品微服务然后,我们开始编写具体代码。先定义Goods实体类,如程序清单9-5所示。类上面的3个注解使用的是Lombok注解,需要引入依赖包,具体请参见3.2节。这里我们定义了3个属性,分别是id(商品ID)、name(商品名称)和price(商品价格)。搭建EurekaClient商品微服务然后,定义GoodsService接口,如程序清单9-6所示。我们写两个接口方法分别用于查询所有商品和根据ID查询商品。接着,定义GoodsService接口的实现类GoodsServiceImpl,如程序清单9-7所示。为了实现查询功能,我们需要假设一些数据。首先,定义一个常量goodsMap,用于存储商品集合。然后,在静态代码块中构造3个商品对象,并将其添加进goodsMap。接着,实现GoodsService接口中的两个方法,查询所有商品则返回goodsMap保存的所有商品,根据ID查询商品则返回由goodsMap根据key获取的value,即对应ID的商品。搭建EurekaClient商品微服务然后,定义GoodsService接口,如程序清单9-6所示。我们写两个接口方法分别用于查询所有商品和根据ID查询商品。接着,定义GoodsService接口的实现类GoodsServiceImpl,如程序清单9-7所示。为了实现查询功能,我们需要假设一些数据。首先,定义一个常量goodsMap,用于存储商品集合。然后,在静态代码块中构造3个商品对象,并将其添加进goodsMap。接着,实现GoodsService接口中的两个方法,查询所有商品则返回goodsMap保存的所有商品,根据ID查询商品则返回由goodsMap根据key获取的value,即对应ID的商品。搭建EurekaClient商品微服务搭建EurekaClient商品微服务最后,定义GoodsController类,如程序清单9-8所示。这里定义了两个接口“all”和“one”,分别通过调用GoodsService的实现方法来实现查询商品的功能。然后,我们启动商品微服务,在浏览器中进行测试,如图9-8和图9-9所示。搭建EurekaClient商品微服务Eureka服务注册与发现12搭建EurekaServer服务注册中心3搭建EurekaClient商品微服务4搭建EurekaClient订单微服务5微服务之间的交互-Feign搭建EurekaClient订单微服务在9.3节中我们搭建好了一个商品微服务,本节我们来搭建一个订单(order)微服务,实现简单的查询订单的功能。通常订单只保存商品的ID,而我们在查询订单的时候需要看到商品的详细信息,所以就需要通过调用商品微服务来协助订单微服务实现此项功能。此时,商品微服务就是服务提供者,而订单微服务则是服务消费者。我们开始创建订单微服务,如图所示,使用IDEA创建一个名为order的SpringBoot项目。同样地,在“dependcies”界面中勾选“Web”中的“SpringWeb”和“SpringCloudDiscovery”中的“EurekaDiscoveryClient”。搭建EurekaClient订单微服务创建好后,同样地,我们先将配置文件扩展名改成“.yml”。然后在application.yml中写入配置,如程序清单9-9所示。server.port配置服务的端口号为7002,配置服务的名称为order。service-url.defaultZone表示注册中心地址。然后,在项目启动类OrderApplication上添加@EnableEurekaClient注解开启EurekaClient。接着,和创建商品微服务一样,我们构建好如图9-11所示的订单微服务结构。因为订单微服务也需要用到商品类,所以把商品微服务的商品类Goods复制到entity中。搭建EurekaClient订单微服务然后,我们开始编写具体代码。先定义Order实体类,如程序清单9-10所示。这里我们定义了3个属性,分别是id(订单ID)、goodsId(商品ID)和time(下单时间)。然后,定义OrderService接口,如程序清单9-11所示。我们写两个接口方法分别用于查询所有订单和根据ID查询订单。搭建EurekaClient订单微服务接着,定义OrderService接口的实现类OrderServiceImpl,如程序清单9-12所示。为了实现查询功能,我们需要假设一些数据。首先,定义一个常量orderMap,用于存储订单集合。然后,在静态代码块中构造3个订单对象,并将其添加进orderMap。接着,使用RestTemplate调用商品微服务。RestTemplate是由Spring提供的一个HTTP请求工具。除了RestTemplate,也可以使用Java自带的HttpURLConnection或者经典的网络访问框架HttpClient。在SpringBoot项目中,使用RestTemplate更方便一些。然后,我们实现OrderService接口中的findAll方法,查询所有订单则返回orderMap保存的所有订单,不过我们还要循环遍历调用findGoodsById方法查询出每个订单的商品信息,然后将其组合成一个集合返回。最后,实现OrderService接口中的findById方法,首先根据订单ID查询出订单信息,再根据订单信息中的商品ID通过调用findGoodsById方法查询出对应的商品信息,最后将它们组合成一条完整的订单信息返回。搭建EurekaClient订单微服务搭建EurekaClient订单微服务我们写完之后发现restTemplate带红色波浪线,原因是我们没有指定要注入的对象。所以需要写配置类。不过为了简便,可以直接在启动类上写相应代码,如程序清单9-13所示。其中,@LoadBalanced表示开启负载均衡,这时的RestTemplate便只能调用注册中心中注册的服务,并且通过服务名来调用。搭建EurekaClient订单微服务最后,定义OrderController类,如程序清单9-14所示。这里定义了两个接口“all”和“one”,分别通过调用OrderService的实现方法来实现查询订单的功能。然后,我们启动订单微服务,在浏览器中测试查询所有订单和根据ID查询订单,结果如图9-12和图9-13所示。搭建EurekaClient订单微服务搭建EurekaClient订单微服务最后,我们访问注册中心,验证一下,注册中心是否含有商品微服务和订单微服务的注册信息,如图9-14所示,可以看到,其中含有两个服务的注册信息。其中UP表示续约状态,如果为DOWN则表示下线状态。Eureka服务注册与发现12搭建EurekaServer服务注册中心3搭建EurekaClient商品微服务4搭建EurekaClient订单微服务5微服务之间的交互-Feign微服务之间的交互-Feign我们知道EurekaClient会保存各个服务的信息,其中包含各个服务的地址。那么服务之间到底是怎样通过这些信息进行交互的呢?SpringCloud服务间的调用默认支持两种方式——Ribbon和Feign,具体来说就是使用RestTemplate和FeignClient来调用。不管使用什么方式,本质上都是通过调用服务的HTTP接口进行交互,而参数和结果默认都是通过Jackson序列化和反序列化。9.4节中,我们通过RestTemplate在商品微服务和订单微服务之间进行了HTTP请求,在内部请求过程中使用了“http://goods/goods/one?id=id”这个地址,其中并没有涉及IP地址、域名和端口之类的东西,而是直接通过商品服务名的方式来调用的。正是由于我们添加了@LoadBalanced注解,才能加入Ribbon负载均衡器使用“改造”过的RestTemplate。当RestTemplate发起请求时,请求会被LoadBalancerInterceptor拦截,实际的请求是由LoadBalancer发起的,LoadBalancer会寻找默认或指定的负载均衡策略来对HTTP请求进行转发。在实际开发中,由于对服务的依赖和调用可能不止一处,往往一个接口会被多处调用,所以我们通常都会针对各个服务自行封装一些客户端类来包装这些依赖服务的调用,此时如果使用RestTemplate进行封装,我们会发现几乎每一个调用都是简单的模板化内容。因此,为了简化自行封装服务调用客户端类的开发,SpringCloud提供了Feign对服务调用进行封装,由它来帮助我们定义和实现依赖服务接口,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。微服务之间的交互-FeignFeign是一个声明式的WebService客户端。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好H
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第二章 疾病概论课件
- 治疗室、换药室、处置室消毒隔离制度
- 管道打压吹扫方案
- 环境保护专项施工方案
- 浙教版2021-2022学年度七年级数学上册模拟测试卷 (826)【含简略答案】
- Metixene-hydrochloride-hydrate-Standard-生命科学试剂-MCE
- Methyl-D-galactoside-Methyl-D-Galactopyranoside-生命科学试剂-MCE
- meso-Erythritol-Standard-生命科学试剂-MCE
- 教师面试之课程设计
- 教师节课程设计
- 刑法涉及安全生产的16宗罪
- 《骄人祖先 灿烂文化》 单元作业设计
- 电气屏、柜铜母排制造安装工艺守则
- Web应用安全技术原理与实践全套完整教学课件
- 校园广场景观设计教学课件
- 第十三讲 全面贯彻落实总体国家安全观PPT习概论2023优化版教学课件
- 2023年煤矿企业安全生产管理人员安全资格考试题库及答案
- 脑出血诊疗指南诊疗规范
- 穴位敷贴疗法
- 两栖动物的生殖和发育说课课件
- 上海市房屋租赁合同
评论
0/150
提交评论