本文共 3684 字,大约阅读时间需要 12 分钟。
Ribbon对RestTemplate进行了封装,提供负载均衡和重试功能。RestTemplate是Spring Boot提供的一个远程调用工具,可以执行GET和POST等请求。
getForObject("url", 转换类型, 提交的参数)
新建项目
application.yml
spring: application: name: ribbon server: port: 3001 eureka: client: service-url: defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
主程序
@EnableDiscoveryClient
注解RestTemplate
实例@RestControllerpublic class RibbonController { @Autowired private RestTemplate rt; @GetMapping("/item-service/{orderId}") public JsonResult getItem(@PathVariable String orderId) { return rt.getForObject("http://item-service/{1}", JsonResult.class, orderId); } @PostMapping("/item-service/decreaseNumber") public JsonResult decreaseNumber(@RequestBody List- items) { return rt.postForObject("http://item-service/decreaseNumber", items, JsonResult.class); } @GetMapping("/user-service/{userId}") public JsonResult getUser(@PathVariable Integer userId) { return rt.getForObject("http://user-service/{1}", JsonResult.class, userId); } @GetMapping("/user-service/{userId}/score") public JsonResult addScore(@PathVariable Integer userId, Integer score) { return rt.getForObject("http://user-service/{1}/score?score={2}", JsonResult.class, userId, score); } @GetMapping("/order-service/{orderId}") public JsonResult getOrder(@PathVariable String orderId) { return rt.getForObject("http://order-service/{1}", JsonResult.class, orderId); } @GetMapping("/order-service") public JsonResult addOrder() { return rt.getForObject("http://order-service/", JsonResponse.class); }}
项目启动
mvn spring-boot:run
访问测试
http://eureka1:2001
http://localhost:3001/item-service/decreaseNumber
[{"id":1, "name":"abc", "number":23},{"id":2, "name":"def", "number":11}]
添加 ripple 依赖
org.springframework.cloud spring-cloud-starter-netflix-ribbon
在主程序中加 @LoadBalanced
注解
访问路径改为服务ID
添加 retry 依赖
org.springframework.retry spring-retry
在 application.yml 配置重试参数
spring: application: name: ribbon server: port: 3001 eureka: client: service-url: defaultZone: http://eureka1:2001/eureka, http://eura2:2002/eureka ribbon: MaxAutoRetries: 1 MaxAutoRetriesNextServer: 2 OkToRetryOnAllOperations: true
设置超时时间
@Beanpublic RestTemplate getRestTemplate() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(1000); factory.setReadTimeout(1000); return new RestTemplate(factory);}
修改 ItemController 添加延迟
@Slf4j@RestControllerpublic class ItemController { @Autowired private ItemService itemService; @Value("${server.port}") private int port; @GetMapping("/{orderId}") public JsonResult getItem(@PathVariable String orderId) throws Exception { log.info("server.port = {}, orderId = {}", port, orderId); if (Math.random() < 0.6) { log.info("temp sleep: {}", new Random().nextInt(5000)); Thread.sleep(new Random().nextInt(5000)); } List- items = itemService.getItems(orderId); return JsonResult.ok(items); }}
http://localhost:3001/item-service/decreaseNumber
转载地址:http://fxwhz.baihongyu.com/