Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性简化了分布式系统的开发,比如服务发现、服务网关、服务路由、链路追踪等。Spring Cloud 并不重复造轮子,而是将市面上开发得比较好的模块集成进去,进行封装,从而减少了各模块的开发成本。换句话说:Spring Cloud 提供了构建分布式系统所需的"全家桶"。
优点:
缺点:
常见的与 Spring Cloud 配合的组件
服务注册与发现:Eureka、Consul、Etcd、Nacos
服务调用和负载均衡:OpenFeign、LoadBalancer
分布式事务:Seata、LCN、Hmily
服务熔断和服务降级:Circuit Breaker、Sentinel
服务链路追踪:Micrometer Tracting
服务网关:Gateway
分布式配置管理:Consul、Nacos
项目创建步骤
spring cloud 父工程中,若指定了版本号,则子工程添加对应依赖时不需要指定版本号,保证了多个子项目使用同样的依赖。当想升级或切换版本时,只需要更新父工程。若某个子项目需要另外的版本,则在子类的 version 标签中指定即可。
dependencyManagement 标签只做声明依赖,并不引入,因此子项目使用时需要显示声明需要使用的依赖。如果不在子项目中显示声明,只有在子项目中写了依赖项且不指定版本时,才会从父项目中继承该项。
若依赖粘贴后,dependencyManagement 标签内爆红,无需处理。原因是此处仅仅是声明,内部 jar 包并未下载。当子工程使用该依赖时,Maven 进行对应依赖下载后即可变为正常颜色。如果有强烈的需求要消除爆红,则需要将 dependencyManagement 标签整体注释,先使用子项目导入依赖进行下载,然后放开注释让父项目加载。
自带的跨服务通信组件TemplateComfig
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
public static final String pay_url = "http://localhost:8001";
@Resource
private RestTemplate restTemplate;
@PostMapping("/consumer/pay/select")
public ResultVO selectOrder(@RequestBody PayDTO pay){
return restTemplate.postForObject(pay_url+"/pay/select", pay, ResultVO.class);
}
我们在具体的业务模块,为了不暴露某些信息,选择将具体的实现对象封装为 DTO 对象进行返回。那么模块调用方同样需要准备一个相同的 DTO 对象来接收数据。两个模块同时包含同一份代码,不满足微服务模块的设计初衷。
所以基于此类情况,建议创建一个公共的模块用于各类 api 请求接收发送和对象数据传输。
按照上文顺序创建一个 cloud-api 模块,将数据传输对象 DTO、数据返回对象 ResultVO、全局异常处理 GlobalException 、基础工具类 CloudUtil 等各模块所使用的公共代码存放至该模块。模块由于作为一个公共 api 使用,所以不含 application.yml,不含启动类,pom 文件中也只引入使用到的基础依赖。
当上述流程完成后,点击 maven - install 进行打包,结束后会在 target 文件夹内生成一个 jar 包。
<!--引入自建api模块-->
<dependency>
<groupId>org.example.cloud</groupId>
<artifactId>cloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。