关于java:20212245day02

7次阅读

共计 1948 个字符,预计需要花费 5 分钟才能阅读完成。

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<Item> 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

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


调用地址,给成服务 id(不是写死的端口号了)

2.2 重试(重试不是必须的,看零碎要求)

2.2.1 增加 spring-retry 依赖(不能用插件,间接写,而后又提醒)

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

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 中模仿超时失败

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
正文完
 0