2021/2/24/5/day02

1.RestTemplate

spring提供的,专门用来做Rest API远程调用的工具,
它类似于HttpClient,是执行http请求的工具。RestTemplate对Rest API做了高度封装,提供了非常简单的方法:
getForObject(url,转换类型,提交的参数数据),例如:
return restTemplate.getForObject("http://item-service/{1}", JsonResult.class, orderId);
postForObject(url,协议体数据(头、体的体),转换的类型)。例如:
@PostMapping("/item-service/decreaseNumber")
public JsonResult decreaseNumber(@RequestBody List items){
    return restTemplate.postForObject("http://item-service/decreaseNumber",items,JsonResult.class);
}

1.1远程调用

1.  新建模块: sp06-ribbon
2.  添加依赖:web、eureka-client、ribbon、sp01    
3.  yml:app.name、port、eureka地址
4.  新建 RestTemplate 实例。在启动类中。如下:
@Bean
public RestTemplate restTemplate(){
   //使用请求工厂来设置超时参数
 SimpleClientHttpRequestFactory f = new SimpleClientHttpRequestFactory();
   f.setConnectTimeout(1000);
   f.setReadTimeout(1000);
   return new RestTemplate(f);
}
5.  RibbonController 中,使用 RestTemplate 调用 2,3,4 项目

2.Ribbon

对RestTemplate功能进行加强,添加了负载均衡和重试。

2.1负载均衡

添加集群:Item8001和Item8002

2021/2/24/5/day02_第1张图片

对RestTemplate添加注解@EnableBalanced,对它进行增强。

2021/2/24/5/day02_第2张图片
调用地址,给成服务id(不是写死的端口号了)
2021/2/24/5/day02_第3张图片

2.2重试(重试不是必须的,看系统要求)

2.2.1添加spring-retry依赖(不能用插件,直接写,然后又提示)

2021/2/24/5/day02_第4张图片

2.2.2配置重试参数,没有提示(只能手写在配置文件里)

2021/2/24/5/day02_第5张图片

ribbon:
  MaxAutoRetries: 1
  MaxAutoRetriesNextServer: 2

2.2.3在06-ribbon的启动类中,使用请求工厂来设置超时参数

@Bean
public RestTemplate restTemplate(){
   //使用请求工厂来设置超时参数
 SimpleClientHttpRequestFactory f = new SimpleClientHttpRequestFactory();
   f.setConnectTimeout(1000);
   f.setReadTimeout(1000);
   return new RestTemplate(f);
}
setConnectTimeout-连接超时时间
setReadTimeout-已经连接,并且已经发送请求,接受响应时的超时时间
这两个超时时间,不能再yml中设置,只能使用java代码设置

2.2.4在itemController中模拟超时失败

2021/2/24/5/day02_第6张图片

if(Math.Random()<0.9){//90%的概率执行延迟
    //随机延迟0-5秒
    long t = new Random().nextInt(5000);
    System.out.println("延迟"+t);
    Thread.sleep(t);

    }

2.2.5把sp05-eureka配置文件复制两份:

application-eureka1.yml 1连接2
eureka:
  client:
    register-with-eureka: true
 fetch-registry: true
 #1连接2
 service-url:
      defaultZone: http://eureka2:2002/eureka
  instance:
    #集群中区分不同服务器主机名
 hostname: eureka1
application-eureka2.yml 2连接1
eureka:
  client:
    register-with-eureka: true
 fetch-registry: true
 #2连接1
 service-url:
      defaultZone: http://eureka1:2001/eureka
  instance:
    #集群中区分不同服务器主机名
 hostname: eureka2

你可能感兴趣的:(java)