微服务是一种分布式架构,分布式架构就是把服务做拆分,在我们的传统单体架构中,我们把所有的服务都写在一起,随着业务的扩大我们的代码耦合度会变得越来越高,后期维护起来也很不方便。微服务就是把模块拆分,把我们整个项目拆解分成许多独立的子项目,每个子项目之间独立开发和部署,子项目也有自己独立的功能,这些独立的子项目就形成了微服务,不同的子项目就进而形成一个服务集群。
举例说明:一个商城系统很多模块组成,例如订单模块、用户功能、商品服务、支付模块等,这些模块如果采用单体架构,代码之间的耦合度会非常高,也不便于后期的维护,当一个模块出现问题时整个项目也会受到影响。如果采用微服务,每个模块独立开发,由这些子模块构成整个商城系统,有利于提升我们的开发效率,也便于后期的维护。
单体架构:
优点:架构简单、部署成本低。
缺点:耦合度高。
微服务架构:
优点:耦合度低、便于后期维护扩展。
缺点:部署成本高、需要实线远程调用。
二、微服务特征
三、微服务中各组件的作用
注册中心:记录微服务中每个服务的ip、端口、能干什么事等信息。(我们调用微服务中的某个服务时,可能服务A需要调用服务B,服务B需要调用服务C,注册中心负责记录服务之间的调用关系,我们调用服务时找注册中心就可以了)。
配置中心:统一管理每个服务的配置信息,如果需要变更某个服务的配置信息,只需找到配置中心即可。
网关服务:形如小区保安,能对用户身份做校验,另一方面可以把用户的请求路由到具体的服务中去。
四、微服务技术对比
以Spring Cloud Alibaba为重点学习。
自我建议学习第三种方案:Spring Cloud Alibaba + Dubbo
五、微服务远程调用
在单体项目中要实线服务的调用可直接调用(调用对应的service方法),由于微服务中各模块是独立的,各自的数据库都是不可见的,因此通过远程调用来实现互相调用,**实际项目中常使用@FeignClient实现服务的远程调用。**简单的远程调用代码如下:
- 注册RestTemplate
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
//创建RestTemplate并注入Spring容器
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
- 修改OrderService(OrderServiceImpl)
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
//1.查询订单
Order order = orderMapper.findById(orderId);
//2.利用RestTemplate发起http请求,查询用户
//2.1.远程调用user信息
String url = "http://localhost:8081/user/" + order.getUserId();
//2.2.发送http请求,实现远程调用
User user = restTemplate.getForObject(url, User.class);
//3.封装user到Order
order.setUser(user);
//4.返回
return order;
}
}
六、消费者与提供者
服务提供者:提供接口给其他微服务调用。
服务消费者:调用其他微服务的接口。
一个微服务既可以是消费者,也可以是提供者,例如服务A调用服务B,服务B又调用服务C,因此B即使消费者又是提供者。对于一个微服务具体是消费者还是提供者,是相对的。
七、Eureka注册中心
由于微服务远程调用地址很多,并且地址也在不停的发生变化,因此不能每次都写死调用的地址,并且我们的服务提供者又很多,也不知道到底该调用哪一个提供者,因此采用Eureka,它替我们解决此问题。
Eureka作用:
在Eureka中,微服务分为客户端和服务的两类,服务端记录服务信息,客户端记录的是服务提供者和服务消费者。