SpringCloud环境搭建:生产和消费 RestTemplate

Spring章节复习已经过去,新的章节SpringCloud开始了,这个章节中将会回顾微服务相关
主要依照以下几个原则

  1. 每一个组件的Demo和Coding上传到我的代码仓库
  2. 在原有基础上加入一些设计模式,stream+lamdba等新的糖
  3. 通过DeBug调试,进入组件源码去分析底层运行的规则和设计模式

相关的代码已经上传到
链接: SpringCloudServiceDemo
可以进入master分支去看

SpringCloud的服务调用

需求分析

  1. 将两个模块:订单和用户信息
  2. 从订单 单体微服务中获取订单信息,包括用户信息
  3. 如何从订单 服务 去调取 用户信息那?

一般通过RestTemplate,这种就是通过RestFul风格调用url的方式进行微服务信息的传递

@Component
public class BeanFactory {

    @Bean
    public static RestTemplate getRestTemplate(){
        return new RestTemplate();
    }


    @Bean("curTemplate")
    public RestTemplate RestTemplate(){
        return new RestTemplate();
    }
}

配置Bean,可以用过静态方法或者直接注入的方式拿到;

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

}

@SpringBootApplication

配置SpringBootApplication就是为
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

  1. @ComponentScan就是为AnnotationBeanFactory可以加载对应的主键
  2. @EnableAutoConfiguration扫描对应的包,自动配置信息,不需要手动配置 @Import(AutoConfigurationPackages.Registrar.class)
  3. @SpringBootConfiguration就是个@Configuration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)

业务调用方法一: 通过静态工厂去拿

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderMapper orderMapper;

    public Order queryOrderById(Long orderId) {
        // 通过静态工厂去拿
        Order order =  orderMapper.findById(orderId);
        String url = "http://localhost:8081/user/" + order.getUserId();;
        order.setUser(BeanFactory.getRestTemplate().getForObject(url, User.class));

        return order;
    }
}

业务调用方法二: 通过注入依赖去拿

@Service
public class OrderServiceImpl implements OrderService {


    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    @Qualifier("curTemplate")
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {

        // 通过原生AutoWired去拿
        Order order =  orderMapper.findById(orderId);
        String url = "http://localhost:8081/user/" + order.getUserId();
        order.setUser(restTemplate.getForObject(url, User.class));


        return order;
    }
}

SpringCloud框架(一):环境搭建 生产和消费 RestTemplate,底层源码解读-LMLPHP

Template的底层源码分析

进行debug,加载源码包

SpringCloud框架(一):环境搭建 生产和消费 RestTemplate,底层源码解读-LMLPHP

配置断点

SpringCloud框架(一):环境搭建 生产和消费 RestTemplate,底层源码解读-LMLPHP
调用我们后端传入的url

SpringCloud框架(一):环境搭建 生产和消费 RestTemplate,底层源码解读-LMLPHP
SpringCloud框架(一):环境搭建 生产和消费 RestTemplate,底层源码解读-LMLPHP

创建一个工厂,存放url
SpringCloud框架(一):环境搭建 生产和消费 RestTemplate,底层源码解读-LMLPHP
工厂创建后,对request请求路径封装

SpringCloud框架(一):环境搭建 生产和消费 RestTemplate,底层源码解读-LMLPHP

这里的方法就是将请求转发过去,获取一个响应
SpringCloud框架(一):环境搭建 生产和消费 RestTemplate,底层源码解读-LMLPHP

12-06 04:33