我的疑问:分布式和微服务是什么?他们不都是把原来的单体架构进行拆分吗?他们的区别是什么?
一个项目就是一个war包,部署在一个服务器上
就是将原来的单体架构进行拆分;
原来的一个项目部署在一个服务器上,天天用,日积月累,计算和存储任务也随之增加,时间久了,服务器受不了了,于是加内存,加磁盘,换CPU,但是治标不治本,那就将原来的单体架构进行拆分。
简单来说,就好比我们以前接触的三层架构,将每一层都独立出来,打成war包,部署在不同的服务器上
就好比一个电商项目,拆分成订单项目和用户项目
微服务就是很微小的服务,它的特点就是只干一件事。
一个电商项目拆分成订单项目、用户项目,但是还可以拆;
订单项目再拆分为购物项目、结算项目。微服务就出来了,它功能单一;
分布式是分散压力,按模块划分,部署在不同的服务器上;
微服务是分散能力,按功能划分,功能单一,相互隔离,自己管理自己(自治)
分布式属于微服务,但是微服务不一定是分布式,因为微服务的应用不一定是分散在多个服务器上
Spring官网:https://spring.io/
Spring Cloud是Spring提供的微服务框架。它利用Spring Boot的开发特性简化了微服务开发的复杂性,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,这些工作都可以借助Spring Boot的开发风格做到一键启动和部署
通过一系列组件,帮助开发者迅速构件一个分布式系统,Spring Cloud 是通过包装其它公司产品来实现的,比如Spring Cloud整合了开源的Netflix很多产品。Spring Cloud提供了微服务治理的诸多组件,例如服务注册和发现、配置中心、熔断器、智能路由、微代理、控制总线、全局锁、分布式会话等。Spring Cloud组件非常多,涉及微服务开发的诸多场景
五大组件
Spring Cloud实现微服务的治理功能产品很多,下面简单介绍下Spring Cloud各个产品的作用,以及采用的原则,如图1-6所示
pom.xml
com.wjg.demo1
a_cloud_common
1.0-SNAPSHOT
org.projectlombok
lombok
1.18.22
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Payment {
/**
* 订单编号
*/
private Integer id;
/**
* 支付状态
*/
private String message;
}
com.wjg.demo1
a_cloud_common
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
application.properties改名为application.yml指定端口
server:
port: 9001
PaymentController
@RestController
@RequestMapping("/payment")
public class PaymentController {
@GetMapping("/{id}")
public ResponseEntity payment(@PathVariable("id") Integer id) {
Payment payment = new Payment(id, "支付成功");
return ResponseEntity.ok(payment);
}
}
找到services,启动
找到springboot,运行
pom.xml同上
启动类
@SpringBootApplication
public class CCloudOrderApplication {
public static void main(String[] args) {
SpringApplication.run(CCloudOrderApplication.class, args);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
指定端口
server:
port: 9002
OrderController
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/payment/{id}")
public ResponseEntity getPaymentById(@PathVariable("id") Integer id) {
String url = "http://localhost:9001/payment/" + id;
Payment payment = restTemplate.getForObject(url, Payment.class);
return ResponseEntity.ok(payment);
}
}
启动
成功
发现:微服务的调用是向外提供了接口
改代码存在的问题: