Spring Cloud简介
Spring Cloud是Spring提供的微服务框架。它利用Spring Boot的开发特性简化了微服务开发的复杂性,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,这些工作都可以借助Spring Boot的开发风格做到一键启动和部署。
Spring Cloud的目标是通过一系列组件,帮助开发者迅速构件一个分布式系统,Spring Cloud 是通过包装其它公司产品来实现的,比如Spring Cloud整合了开源的Netflix很多产品。Spring Cloud提供了微服务治理的诸多组件,例如服务注册和发现、配置中心、熔断器、智能路由、微代理、控制总线、全局锁、分布式会话等。
Spring Cloud实现微服务的治理功能产品很多,下面简单介绍下Spring Cloud各个产品的作用,以及采用的原则,如下图所示
1、创建公共工程
为了降低服务之间的耦合度使用maven创建公共工程,统一管理案例使用的实体类和工具类。
公共工程的Payment类
package entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment {
private Integer id;
private String message;
}
2、创建Eureka Server
2.1添加Eureka Server依赖
2.2启动器
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
2.3配置文件
server:
port: 9004
spring:
application:
name: eureka-server
eureka:
client:
service-url:
# eureka 服务地址,如果是集群的话;需要指定其它集群eureka地址
defaultZone: http://127.0.0.1:9004/eureka
# 不注册自己
register-with-eureka: false
# 不拉取服务
fetch-registry: false
2.4启动并测试
启动应用访问http://localhost:9004/
接下来模拟一个微服务调用的场景,有两个微服务,一个订单微服务,一个支付微服务,订单微服务通过远程调用支付微服务,完成支付功能。
● 支付微服务工程:服务提供者
● 订单微服务工程:服务使用者。
3、创建服务提供者
3.1添加SpringWeb和Eureka Client依赖
3.2启动器
@SpringBootApplication
@EnableEurekaClient
public class CloudPaymentApplication {
public static void main(String[] args) {
SpringApplication.run(CloudPaymentApplication.class, args);
}
}
3.4配置文件
server:
port: 9001
spring:
application:
name: cloud-payment-service
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:9004/eureka
fetch-registry: true
register-with-eureka: true
4、服务消费者
4.1创建项目
如上像服务提供者创建完项目后导入openfeign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
4.2编写api接口
CLOUD-PAYMENT-SERVICE为服务提供者的服务名
@FeignClient(value ="CLOUD-PAYMENT-SERVICE")
public interface PaymentService {
@GetMapping("/payment/{id}")
public Payment payment(@PathVariable("id") Integer id);
}
4.3编写controller远程调用服务
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private PaymentService paymentService;
@RequestMapping("{id}")
public ResponseEntity<Payment> getPaymentById(@PathVariable("id")Integer id){
Payment payment = paymentService.payment(id);
return ResponseEntity.ok(payment);
}
}
4.4启动项目并访问http://localhost:9002/order/555 结果如下