HTTP vs RPC
1.直接写url :http://localhost:8080/msg
使用 restTemplate.getForObject("http://localhost:8080/msg", String.class);方法
@RestController @Slf4j public class ClientController { @GetMapping("/getProductMsg") public String getProductMsg(){ //1. 第一种方式 RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject("http://localhost:8080/msg", String.class); log.info("response={}",response); return response; } }
缺点:地址是写死的,如果对方服务有多台,这样很不好。
2.通过 ServiceInstance serviceInstance = loadBalancerClient.choose("ServerId"); 获得服务的信息。 ServerId :服务的名字
@Autowired private LoadBalancerClient loadBalancerClient; @RestController @Slf4j public class ClientController { @Autowired private LoadBalancerClient loadBalancerClient; @GetMapping("/getProductMsg") public String getProductMsg(){ //2.第二种 ServiceInstance serviceInstance= loadBalancerClient.choose("PRODUCT"); String url = String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort())+"/msg"; RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject(url, String.class); log.info("response={}",response); return response; }
优点:我们可以不知道服务的路径,通过服务Id或者服务路径信息 缺点:编码比较繁琐
3.用@LoadBalanced 可在restTemplate里使用应用名字来访问
@Component public class RestTemplateConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } } @RestController @Slf4j public class ClientController { @Autowired private RestTemplate restTemplate; @GetMapping("/getProductMsg") public String getProductMsg(){ //3.第三种方式 利用@LoadBalanced 可在restTemplate里使用应用名字 String response = restTemplate.getForObject("http://PRODUCT/msg", String.class); log.info("response={}",response); return response; } }
RestTemplate有三种方式:
通过feign我们能把http远程调用对开发者完全透明,得到与调用本地方法一样的编码体验
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>2.0.0.M1</version> </dependency>
(org.springframework.cloud.netflix.feign.EnableFeignClients;)
package com.imooc.order; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } }
package com.imooc.order.client; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(name="product") public interface ProductClient { @GetMapping("/msg") String productMsg(); }
package com.imooc.order.controller; import com.imooc.order.client.ProductClient; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController @Slf4j public class ClientController { @Autowired private ProductClient productClient; @GetMapping("/getProductMsg") public String getProductMsg(){ String response = productClient.productMsg(); log.info("response={}",response); return response; } }
原文链接:https://www.cnblogs.com/net-safe/p/13529332.html