1. 概述
springCloud能够为我们解决分布式微服务开发过程问题
springCloud是一个解决微服务开发过程中问题的工具集合
微服务开发
微服务:小的服务
- 服务:能够具备一定功能接口,项目
- 服务粒度:服务大小架构师对服务拆分
- 服务拆分:
- 业务拆分
- 模块功能拆分
- 服务拆分:
服务拆分问题:
2. 注册中心
分布式系统基础理论:CAP定理
C:一致性
A:原子性
P:分区容错性
定理:三个中只能同时满足两个,注意P一定存在
组合中哦只有两种:CP,AP
Nacos是基于CP,Eureka是基于AP
Eureka
Eureka是Netfix公司提供一个关于微服务注册中心解决方案,spring整合到springCloud体系中。
Eureka是基于C/S架构软件
- C:client(客户端)
- S:Server(服务器)
1. 引入依赖
<!--eureka 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2. yml配置
server:
port: 8761
spring:
application:
name: eureka-server
# Eureka 专属配置
eureka:
instance:
hostname: localhost # 主机名
client:
registerWithEureka: false # 要不要把自己注册到Eureka false Eureka单机不要 ,Eureka 集群 true ,默认true
fetchRegistry: false # 要不要从Eureka中抓取地址, Eureka自己单机不需要的。 Eureka集群 true,默认true
serviceUrl:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://localhost:8761/eureka/ # 暴露eureka服务地址,后面客户端通过这个地址连接上Eureka服务端。
3. 访问端口
4. 启动类
@SpringBootApplication
@EnableEurekaServer // 开启Eureka服务端
public class EurekaServerApp {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApp.class,args);
}
}
5. 原理图
Nacos
nacos 阿里巴巴旗下产品,2018年和springcloud共建微服务生态体系,形成spring cloud alibaba,它是一套阿里内部微服务解决方案
1. 依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2. 使用springcloud中特有配置文件:bootstarp.yml 【加载优先级最高】
Consoul
3. 服务调用
Feign
使用feign解决了RestTemplate服务代码冗余且不规范。
Feign也是Netfix产品,但是不支持springmvc中注解,因此springcloud把feign改良形成spring cloud openfeign
Feign解决服务调用(基于Rest,动态代理)
1. 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
注意:谁调用放在谁的一方,一般放在服务调用方用。
2. 编码
声明一个feign接口:接口中编写的方法,就是调用服务的controller方法的声明
@FeignClient("USER-SERVICE") //被调用方的服务名称
public interface UserFeignClient {
@GetMapping("user/{id}")
public User queryById(@PathVariable("id") Long id);
}
3. 业务层
@Service
public class OrderService {
@Autowired
private UserFeignClient userFeignClient;
@Autowired
private OrderMapper orderMapper;
public Order getById(Long id){
Order order = orderMapper.findById(id);
Long userId = order.getUserId();
//调用feign,获取user的内容
User user = userFeignClient.queryById(userId);
order.setUser(user);
return order;
}
}
/被调用方的方法/
//controller
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
}
//service
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User queryById(Long id) {
return userMapper.findById(id);
}
}
4. 启动类
@SpringBootApplication
@EnableFeignClients(basePackages = "cn.itcast.order.feign")//feign接口包全路径
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
总结:feign基于动态代理,基于RestTemplate。
拦截@FeignClient修饰的接口,取出接口上服务的名称,拼接上方法上映射地址就形成调用地址,在使用RestTemplate发送请求(方法请求映射方式)
dubbo
4. 服务负载均衡组件
Ribbon
1. 引入rabbin依赖
2. 使用注解@LoadBalanced
@Bean
@LoadBalanced //负载均衡(服务可能会有多个)
public RestTemplate restTemplate(){
return new RestTemplate();
}
3. 业务层:使用restTemplate调用地址:http://服务名称/地址
@Service
public class OrderService {
@Autowired
private RestTemplate restTemplate;
@Autowired
private OrderMapper orderMapper;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
/**
* ribbon提供的负载均衡做
*/
String url = "http://USER-SERVICE/user/"+order.getUserId();
User user = restTemplate.getForObject(url, User.class);
order.setUser(user);
}
4. 启动类加@EnableDiscoveryClient
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced //负载均衡(服务可能会有多个)
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
手动开启负载均衡
5. 服务熔断组件
zuul
spring cloud gateway
网关:访问微服务入口或者出口
网关功能:
1. 路由:
静态路由动态路由
2. 过滤
局部过滤:spring cloud gateway 提供好的
全局过滤:流量控制,鉴权等
1. 依赖
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>