写在前面的话:本文大部分都是抄写的,课堂的资料写的又特别好。目前的我还不知道怎么改写写出我的笔记。以后再改吧。
感谢你的路过,希望学生的笔记能给你一点微不足道的参考(2/100)
Java基础思维导图,完整Java体系的链接
微服务部分内容链接
大概十几个文章吧
3.1 RestTemplate简介
RestTemplate是Spring Resources中一个访问第三方RESTful API接口的网络请求框架。RestTemplate的设计原则和其他的Spring Template(例如JdbcTemplate)类似,都是为了执行复杂任务提供了一个具有默认行为的简单方法。
RestTemplate是用来消费REST服务的,所以RestTemplate的主要方法都与REST的HTTP协议的一些方法紧密相连,例如HEAD、GET、POST、PUT、DELETE、OPTIONS等方法,这些方法在RestTemplate类对应的方法为headForHeaders(),getForObject()、postForObject()、put()、delet()等。
举例说明,在订单服务通过RestTemplate的getForObject方法调用支付服务,并且将调用结果反序列化成Payment对象,代码如下。
@GetMapping("/payment/{id}")
public ResponseEntity<Payment> getPaymentById(@PathVariable("id") Integer id) {
String url = "http://localhost:9001/payment/" + id;
List<ServiceInstance> serviceInstances = discoveryClient.getInstances("cloud-payment-service");
ServiceInstance serviceInstance = serviceInstances.get(0);
url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/payment/" + id;
Payment payment = restTemplate.getForObject(url, Payment.class);
return ResponseEntity.ok(payment);
}
RestTemplate支持常见的Http协议请求方法,例如post, get, delete等,所以用RestTemplate很容易构建RESTfule API。上述案例结果返回json对象,使用jackson框架完成。
3.2 LoadBalancer负载均衡
负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式。一种独立进程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如Nginx。另一种是将负载均衡逻辑以代码的形式封装到服务消费者的客户端上,服务消费者客户端维护了一份服务提供者的信息列表,有了信息表,通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。
SpringCloud原有的客户端负载均衡方案Ribbon已经被废弃,取而代之的是SpringCloud LoadBalancer,LoadBalancer是Spring Cloud Commons的一个子项目,他属于上述的第二种方式,是将负载均衡逻辑封装到客户端中,并且运行在客户端的进程里。
在Spring Cloud构件微服务系统中,LoadBalancer作为服务消费者的负载均衡器,有两种使用方式,一种是和RestTemplate相结合,另一种是和Feign相结合,Feign已经默认集成了LoadBalancer,关于Feign下一章讲解。
3.2.1 LoadBalancer整合RestTemplate
在支付微服务工程中进行如下更改。
1.配置文件
在application.yml配置文件中,使用spel指定端口,表示存在port参数使用port参数,不存在使用默认9001端口, 启动支付服务时,可以通过指定-Dport=9000,指定支付服务使用不同端口启动,具体参考后面内容。
server:
port: ${
port:9001}
2.PaymentController
在提供支付服务时,把端口打印出来,方便查看测试效果。代码如下。
@RestController
@RequestMapping("/payment")
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/{id}")
public ResponseEntity<Payment> payment(@PathVariable("id") Integer id) {
Payment payment = new Payment(id, "支付成功,服务端口=" + serverPort