栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

微服务(一)——SpringCloud(体系、简介、简单启用 eureka、eureka集群、eureka工作细节、服务注册与消费、简化轮询负载均衡代码、RestTemplate 详细用法(增删改查)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

微服务(一)——SpringCloud(体系、简介、简单启用 eureka、eureka集群、eureka工作细节、服务注册与消费、简化轮询负载均衡代码、RestTemplate 详细用法(增删改查)

微服务(一)——SpringCloud(体系、简介、简单启用 eureka、eureka集群、eureka工作细节、服务注册与消费、简化轮询负载均衡代码、RestTemplate 详细用法(增删改查) 一、SpringCloud 1、引言和介绍

微服务是一种思想,SpringCloud 只是落地的一种实现。能把微服务用好的公司并不算特别多;如果是企业级应用使用微服务的概率小,如果是互联网项目的话使用微服务的概率高一些。

什么是微服务?

优势:

    复杂度可控独立部署技术选型灵活较好的容错性较强的可扩展性

使用 Spring Cloud 的优势:

什么是 Spring Cloud?
Spring Cloud 是一系列框架的集合,Spring Cloud 内部包含了许多框架,这些框架互相协作,共同来构建分布式系统。利用这些组件,可以非常方便的构建一个分布式系统。

核心特性:

    服务注册与发现负载均衡服务之间调用容错、服务降级、断路器消息总线分布式配置中心链路器
2、Spring Cloud 体系 a、Spring Cloud 包含的组件

b、Spring Cloud 和 Spring Boot 版本关系

3、微服务技术栈简介

4、简单启用 eureka a、前期准备

先创建一个空的工程:

然后:

创建 eureka(SpringBoot 项目):

创建客户端(SpringBoot 项目):

b、服务端代码实现

启动类:

然后启动项目,能看见下图就是成功访问:

c、客户端代码实现

d、测试

接着启动服务端,然后客户端,然后:

看到这个就说明客户端成功启动。

5、eureka 集群

把 eureka 启动多个实例就算是 eureka 集群了。

使用了注册中心之后,所有的服务都要通过服务注册中心来进行信息交换。服务注册中心的稳定性就非常重要了,一旦服务注册中心掉线,会影响到整个系统的稳定性。所以,在实际开发中,Eureka 一般都是以集群的形式出现的。

Eureka 集群,实际上就是启动多个 Eureka 实例,多个 Eureka 实例之间,互相注册,互相同步数据,共同组成一个 Eureka 集群。

搭建 Eureka 集群,首先我们需要一点准备工作,修改电脑的 hosts 文件( C:WindowsSystem32driversetchosts ):

接着要做的事很简单:
1、多弄几份配置文件
2、打成 jar 包,启动多次,启动过程中这些 eureka 要互相注册。互相注册之后就形成了集群。

a、开始配置集群

eurekaA:


eurekaB:

最后是原本的配置文件,把里面全部注释掉即可。

提醒:其实可以不用配置 A 和 B,但是不配的话启动的时候需要写很多参数。

然后开始打包。打包完后启动:

开启 a 和 b。

提醒:如果只启动一个会报错,因为启动其中一个,要注册到另外一个中去,找不到另外一个便会一直报错。

结果:

可以看到启动了两个。


补充:上图要是中间有,就是集群配置错误。

此时可以去 1112 端口查看,跟上面一样就是没问题。

如果有 c ,甚至更多,难道每个都要互相配吗?

答案是不用,只需要互相关联,形成闭环即可。 例如这样:

但是也有个小问题,如果中间的挂了,那么 c 也不会有 a 了。当然,如果 a 注册到 c 中区,哪怕 b 挂了,此时 c 中也是有 a 的。所以要不要把服务都写上,这个就要看情况了。一般是不需要全部写上,写几个就行。

客户端也是同理。各自注册一个 eureka,就行了,只要这两个 eureka 互相之间能通信,会自动的同步数据!

6、eureka 工作细节 a、Eureka Server

Eureka Server 主要对外提供了三个功能:

    服务注册,所有的服务都注册到 Eureka Server 上面来提供注册表,注册表就是所有注册上来服务的一个列表,Eureka Client 在调用服务时,需要获取
    这个注册表,一般来说,这个注册表会缓存下来,如果缓存失效,则直接获取最新的注册表同步状态,Eureka Client 通过注册、心跳等机制,和 Eureka Server 同步当前客户端的状态
b、Eureka Client

Eureka Client 主要是用来简化每一个服务和 Eureka Server 之间的交互。Eureka Client 会自动拉取、更新以及缓存 Eureka Server 中的信息,这样,即使 Eureka Server 所有节点都宕机,Eureka Client 依然能够获取到想要调用服务的地址(但是地址可能不准确)。

c、服务注册

服务提供者将自己注册到服务注册中心(Eureka Server),需要注意,所谓的服务提供者,只是一个业务上上的划分,本质上他就是一个 Eureka Client。当 Eureka Client 向 Eureka Server 注册时,他需要提供自身的一些元数据信息,例如 IP 地址、端口、名称、运行状态等等。

d、服务续约

Eureka Client 注册到 Eureka Server 上之后,事情没有结束,刚刚开始而已。注册成功后,默认情况下,Eureka CLient 每隔 30 秒就要向 Eureka Server 发送一条心跳消息,来告诉 Eureka Server 我还在运行。如果 Eureka Server 连续 90 秒都有没有收到 Eureka Client 的续约消息(连续三次没发送),它会认为 Eureka Client 已经掉线了,会将掉线的 Eureka Client 从当前的服务注册列表中剔除。

服务续约,有两个相关的属性(一般不建议修改):

eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=90

eureka.instance.lease-renewal-interval-in-seconds 表示服务的续约时间,默认是 30 秒eureka.instance.lease-expiration-duration-in-seconds 服务失效时间,默认是 90 秒

这里还有个问题,后面容错机制的时候再讲。

e、服务下线

当 Eureka Client 下线时,它会主动发送一条消息,告诉 Eureka Server ,我下线啦。

f、获取注册表信息

Eureka Client 从 Eureka Server 上获取服务的注册信息,并将其缓存在本地。本地客户端,在需要调用远程服务时,会从该信息中查找远程服务所对应的 IP 地址、端口等信息。Eureka Client 上缓存的服务注册信息会定期更新(30 秒),如果 Eureka Server 返回的注册表信息与本地缓存的注册表信息不同的话,Eureka Client 会自动处理。

这里,也涉及到两个属性,一个是是否允许获取注册表信息:
eureka.client.fetch-registry=true

Eureka Client 上缓存的服务注册信息,定期更新的时间间隔,默认 30 秒:
eureka.client.registry-fetch-interval-seconds=30

7、服务注册与消费

这里就使用普通的 eureka 就行了。

这里再加两个项目,分别名为 storage 和 business,创建步骤参考上方客户端部分。

a、代码实现

先写一个接口:

然后注册:

然后启动服务端和 stroage。

接着 business 也写一个接口。但是 business 要访问 storage,需要知道 url 、端口,所以要到 eureka 去查询(其实有一套自动的方案,这里先展示纯手动的方案):

首先就注意这个类不要选错包:

然后接口:

配置:

最后结果:
访问接口,效果:

b、手写负载均衡

storage 配置修改:

然后代码修改这里:

接着可以通过一个简单的轮询方式来做负载均衡:

然后看效果:

可以看到轮流着来。

这就是一个纯手工的简单的负载均衡。

8、通过 RestTemplate 简化轮询负载均衡代码

其实仔细观察可以发现,上面的代码有很多重复的,是可以简化封装一部分的。下面就演示 RestTemplate 的负载均衡用法,RestTemplate 内部已经封装好了很多东西。看看 RestTemplate 的包:

可以发现跟什么 SpringBoot 和 SpringCloud 都没关系。实际上这是一个通用的工具。可以简单理解为 http 的一个请求工具。

a、RestTemplate 使用轮询负载均衡

先注册 RestTemplate:

接着简化接口代码:

可以看到比上面的代码少了一大部分。

接着启动 eureka,business,和控制台启动两个 storage,设置其中一个端口为 2009,然后测试就可以发现能够正常使用轮询负载均衡。

b、@LoadBalanced——开启负载均衡功能

其实还能继续精简,上图红色框框的上面部分代码,其实也是经常重复的,那么这部分代码也是可以精简的。

首先先使用注解 @LoadBalanced 开启负载均衡功能:

接着接口:

此时再去刷新测试,运行正常。

注意:如果此时再去使用上面的 hello2 接口,会报一个错误:

开启了负载均衡注解之后,只能用 hello3 接口的这种方式,没开才能用 hello2 的那种方式。注意不要混用了! 因为开启注解之后,对解析 url 的方式不同了。

9、RestTemplate 详细用法(增删改查) a、前期准备

因为需要一个公共的服务,所以需要新加一个模块。

这个模块是 maven 项目,然后创建一个实体类:

然后 storage 和 business 分别引用这个模块:


接着创建一个 Book 的接口:

接着就是 business 如何调用的问题:

b、getForObject 和 getForEntity 的区别


getForObject 和 getForEntity 它们的返回值不同。

如果仅仅想知道返回的结果是什么,只需要 getForObject 即可。
如果还想要知道响应头等诸如这些 http 的信息,就返回 getForEntity 即可。

c、get 请求、使用 getForEntity


然后效果:

d、post 请求 (1)postForObject

(2)postForLocation

post 一般用来做添加,添加完成后,一般要重定向到列表页面,所以这个接口的返回值是一个 URI,这是一个重定向的地址。
uri 就是要重定向的地址。
调用这个方法有一个要求:目标接口必须返回重定向,必须是响应 302。


效果:

e、PUT 和 DELETE 请求

这里由于没有返回,所以正常运行即可。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/775244.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号