spring cloud 介绍
spring Cloud是一个基于Spring Boot实现的微服务架构开发工具。它为微服务架构中涉及的服务治理、断路器、负载均衡、配置管理、控制总线和集群状态管理等操作提供了一种简单的开发方式。
- 外部或者内部的非Spring Cloud项目都统一通过API网关(Zuul)来访问内部服务。
- 网关接收到请求后,从注册中心(Eureka)获取可用服务。
- 由Ribbon进行均衡负载后,分发到后端的具体实例。
- 微服务之间通过Feign进行通信处理业务。
- Hystrix负责处理服务超时熔断。
- Turbine监控服务间的调用和熔断相关指标。
配置中心管理各微服务不同环境下的配置文件。
spring cloud官网
spring cloud中文网
spring cloud中文社区
spring cloud
与spring boot
兼容性介绍
官网介绍网址
如果没有对应版本,项目就可能会报错
服务拆分注意事项
- 不同微服务,不要重复开发相同业务
- 微服务数据独立,不要访问其它微服务的数据库
- 微服务可以将自己的业务暴露为接口,供其它微服务调用
使用 RestTemplate 调用远程接口
RestTemplate 是 spring 发起请求的中间件,在没用使用注册中心时使用这个,有注册中心时使用Feign比较好
- 在启动类里配置注入 RestTemplate
@SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } @Bean RestTemplate restTemplate() { return new RestTemplate(); } }
- 调用 RestTemplate 发起请求
get 请求用getForEntity
,post 请求用postForEntity
service public class OrderService { @Autowired private RestTemplate restTemplate; public Order queryOrderById (Long orderId) { //1.查询订单 Order order = orderMapper.findById(orderId); // TOD0 2.查询用户 String url = "http://localhost:8081/usep/" +order.getUserId(); //第二个参数默认是json,填了会反序列化成User类型 User user = restTemplate.getFor0bject(url, User.class); //3.封装user 信息 order.setUser(user); //4.返回 return order; } }
提供者(provide)与消费者(consumer)
服务提供者
:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
服务消费者
:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
提供者
与消费者
角色其实是相对的
一个服务可以同时是服务提供者
和服务消费者
入门案例
创建父级maven工程springcloud-parent
父级工程的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.liu</groupId>
<artifactId>springcloud-parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>user-provider</module>
<module>user-provider-demo01</module>
<module>user-consumer</module>
<module>eureka-server</module>
</modules>
<properties>
<!-- SpringCloud版本 -->
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.2.2.RELEASE</version>
</parent>
<!-- SpringCloud包依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
创建提供者(provide)子工程user-provide
在父级工程springcloud-parent
下创建提供者(provide)的maven子工程user-provide
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-parent</artifactId>
<groupId>org.liu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user-provider</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
server:
port: 18081
启动类
package com.liu.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ProviderApplication{
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
controller层
package com.liu.provider.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController