RestTemplate简介
RestTemplate是Spring Resources 中一一个访问第三方RESTful API 接口的网络请求框架。
RestTemplate的设计原则和其他Spring Template (例如Jdbc Template、JmsTermplate) 类似,都是为执行复杂任务提供了一个具有默认行为的简单方法。
RestTemplate是用来消费REST服务的,所以RestTemplate的主要方法都与REST的Http协议的一些方法紧密相连,例如HEAD、GET、POST、PUT、DELETE和OPTIONS等方法,这些方法在RestTemplate类对应的方法为headForHeaders0、getForObject()、 postForObject()、put()和delete()等。
举例说明,写一个RestTestController 类,获取hts://www.baidu.com/的网页Html代码。
首先在RestTestController 类上加@RestController注解,开启RestController 的功能。通过RestTemplate的getForObject()方法就可以获取htp://www.baidu.com/的网页Html 代码,并在API接口“/testRest" 返回该网页的Html字符串。代码如下:
RestTemplate支持常见的Http协议的请求方法,例如Get、Post、 Put和Delete等,所以用ResTemplate很容易构建RESTful API。 在上面的例子中,RestTemplate 用Get方法获取字符串。RestTemplate 的使用很简单,它支持Xml和JSON数据格式,默认实现了序列化,可以自动将JOSN字符串转换为实体。例如以下代码可以将返回的JSON字符串转换成一个User对象。
Ribbon简介
负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式: - -种是独立进程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如Ngnix;另-种是将负载均衡逻辑以代码的形式封装到服务消费者的客户端上,服务消费者客户端维护了- -份服务提供者的信息列表,有了信息列表,通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。
Ribbon是Netlix公司开源的-一个 负载均衡的组件属于上述的第二种方式,是将负载均衡逻辑封装在客户端中,并且运行在客户端的进程里。Ribbon 是一-个经过 了云端测试的IPC库,可以很好地控制HTTP和TCP客户端的负载均衡行为。
在SpringCloud构建的微服务系统中,Ribbon作为服务消费者的负载均衡器,有两种使用方式,一种是和RestTemplate相结合,另-种是和Feign 相结合。Feign已经默认集成了Ribbon,关于Feign的内容将会在下一章进行详细讲解。
Ribbon有很多子模块,但很多模块没有用于生产环境,目前Netlix公司用于生产环境的
Ribbon子模块如下。
ribon-loadbalancer: 可以独立使用或与其他模块一起使用的负载均衡器API。
ribbon-eureka: Ribbon结合Eureka客户端的API,为负载均衡器提供动态服务注册列表信息。
ribbon-core: Ribbon 的核心API。
使用RestTemplate和Ribbon来消费服务
它包括一个服务注册中心eureka-server、 一个服务提供者eureka-client。eureka-client 向eureka-server注册服务,并且eureka-client提供了一个“/hi" API接口用于提供服务。
启动eureka-server,端口为8761。启动两个eureka-client实例,端口分别为8762和8763。
启动完成后,在浏览器上访问ht:t:/ochost:8761/,浏览器显示eureka-client的两个实例已经成功向服务注册中心注册,它们的端口分别为8762和8763,如图6-1所示。
在5.2节的工程基础之上,再创建一个Module工程,取名为erekar-ibon-client,其作为服务消费者,通过RestTemplate来远程调用eureka client服务API接口的“hi", 即消费服务。
创建完成eureka-ibbon-client的Module工程之后,在其pom文件中引入相关的依赖,包括继承了主Maven工程的pom文件,引入了Eureka Client 的起步依赖spring-cloud-starter-eureka、Ribbon的起步依赖springcloud-starterribbon,以及Web的起步依赖springboot starter- web,代码如下:
在工程的配置文件application.yml 做程序的相关配置,包括指定程序名为eureka-ribbon-client,程序的端口号为8764,服务的注册地址为htp://ocalhost:8761/eureka/,代码如下:
写一个RESTful API接口,在该API接口内部需要调用eureka-client的API接口“/hi",即服务消费。由于eureka-client 为两个实例,它们的端口为8762和8763。在调用eureka-client的API接口“/hi" 时希望做到轮流访问这两个实例,这时就需要将RestTemplate和Ribbon相结合进行负载均衡。
通过查阅官方文档,可以知道如何将它们结合在一起, 只需要在程序的IoC容器中注入一个restTemplate的Bean, 并在这个Bean 上加上@LoadBalanced注解,此时RestTemplate就结合了Ribbon开启了负载均衡功能,代码如下:
写一个RibbonService类,在该类的hi0方法用restTemplate调用eureka-client的API接口,此时Uri上不需要使用硬编码(例如IP地址),只需要写服务名eureka-client 即可,代码如下:
写一个RibbonController类,为该类加上@RestController注解,开启RestController的功能,写一个“hi" Get 方法的接口,调用RibbonService类的hi()方法,代码如下:
启动eureka-ribbon-client工程,在浏览器上访问ht:/ocalhost:876l1,显示的Eureka Server的主界面如图6-2所示。在主界面上发现有两个服务被注册,分别为eureka-client和eureka-ribbon-client,其中eureka-client有两个实例,端口为8762和8763,而eureka-ribbon-client的端口为8764。
在浏览器上多次访问htp:/cahost:8764/hi?7name forezp,浏览器会轮流显示如下内容:
这时可以发现,当访问htpt:/cahost:8764hi?7name-forezp的API接口时,负载均衡器起了作用,负载均衡器会轮流地请求eureka-client的两个实例中的“/hi” API接口。