比如要查询某用户的所有订单 => 在用户服务中访问订单服务。
订单服务
@Controller @RequestMapping("/order") public class OrderController { //根据user_id查询某用户的所有订单 @GetMapping("/user/{user_id}") @ResponseBody public List<Order> queryOrdersByUserId(@PathVariable Integer user_id){ //进过一系列操作,返回订单列表 //..... return orderList; } //..... }
方法返回值要返回给用户服务,需要@ResponseBody转换为json格式,不能String、List、Map什么的直接传过去。
服务本身可能要调用视图来显示,或者直接返回某种类型的数据,不返回json格式的数据,那就需要重新写一个方法来作为服务接口,返回json数据,供其他服务调用。
用户服务
@Controller @RequestMapping("/user") public class UserController { //springboot的服务之间使用REST相互访问、调用,springboot已经把REST封装为RestTemplate类,注入使用即可 private RestTemplate restTemplate; @Autowired public void setRestTemplate(RestTemplate restTemplate) { this.restTemplate = restTemplate; } @GetMapping("/{user_id}/order") @ResponseBody public List<Order> queryOrdersByUserId(@PathVariable Integer user_id){ //订单服务的地址 String url = "http://localhost:8080/order/user/{user_id}"; //参数:服务地址、期待返回的数据类型(class对象)、要传入的参数 List<Order> orderList = restTemplate.getForObject(url, List.class,user_id); return orderList; } //..... }
restTemplate.getForObject(url, targetClass,Object...args); //参数可变
参数指的是url中的参数,比如:
String url = "http://localhost:8080/springboot/user/{group}/{user_id}";
restTemplate.getForObject(url, targetClass,实参1,实参2) //第n个实参对应url中的第n个{ }
我们看到IDEA提示:不能自动装配,因为找不打RestTemplate类型的实例。
我们需要手动创建一个RestTempalte的实例:
@SpringBootApplication public class App{ // 通过指定的方法,自动创建Bean(RestTempalte)的一个实例,放到spring容器中 @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(App.class); } }
在引导类中创建,可供此服务的所有类使用。
上面把服务的url写死在代码中,当然也可以写在application.yml中,使用@Value注入:
server: user: url: http://localhost:8080/springboot/order/user/{user_id}
@Value("${server.user.url}") private String url;
虽然好修改url一些,但节点地址依然是死的、固定的,只会访问指定的节点,做负载均衡、或者服务节点增减时怎么办?
传统的方式是使用nginx做代理、负载均衡,由nginx决定分发到该服务的哪个节点。
微服务有自己的处理方式:SpringCloud使用Eureka来注册、发现服务,Dubbo使用Zookeeper来注册、发现服务。
原文地址:https://www.cnblogs.com/chy18883701161/p/12294628.html
时间: 2024-10-09 10:40:35