微服务入门demo

比如要查询某用户的所有订单 => 在用户服务中访问订单服务。


订单服务

@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来注册、发现服务。

猜你喜欢

转载自www.cnblogs.com/chy18883701161/p/12294628.html