目录
1. 什么是Spring Cloud?
1.1 业务场景介绍
1.2 服务分析
1.3 流程调用
1.4 Spring Cloud
2. Spring Cloud 核心组件
2.1 Eureka
2.2 Feign
2.3 Ribbon
2.4 Hystrix
2.5 Zuul
3.springCloud关系
3.1 Spring Cloud Netflix 第一代
3.2 Spring Cloud Alibaba 第二代
3.2.1 「阿里开源组件」
3.2.2 「阿里商业化组件」
4. SpringCloud常用组件
5. 版本关系
Spring Boot
Spring Cloud
Spring Cloud Dependencies
Spring Cloud中文学习指南
Spring Cloud Alibaba
6. 版本管理规范
7. Nacos 搭建
Nacos官网
7.1 配置Nacos数据库源
7.2 启动Nacos 并访问Nacos管理页面
8. 消费者和生成者编写
8.1 新建一个maven项目为父工程
8.1.1 修改父工程pom文件并添加以下代码
8.2 新建一个springboot项目为子项目 (生产者构建 Provider)
8.2.1 修改并添加子项目pom文件
8.2.2 修改并添加子项目application.yml文件
8.2.3 修改并添加子项目启动类
8.3 新建一个springboot项目为子项目 (消费者构建 Consumer)
8.3.1 修改并添加子项目pom文件
8.3.2 修改并添加子项目application.yml文件
8.3.3 修改并添加子项目启动类
9. 启动子项目Tomcat服务器前往Nacos管理页面查看服务
10. 调用方法
10.1 新增子项目【生产者构建 Provider】Controller模块代码
10.2 修改并添加子项目【消费者构建 Consumer】pom 文件
10.3 新增子项目【消费者构建 Consumer】Controller模块码
10.4 修改并添加子项目【消费者构建 Consumer】启动类
10.5 启动子项目服务器调用并测试方法
开发一个电商网站,要实现支付订单的功能,流程如下:
订单服务、库存服务、仓储服务、积分服务
Eureka Client: 负责将这个服务的信息注册到Eureka Server中
Eureka Server:注册中心,里面有一个注册表,保存了各个服务所在的机器和端口号
集群服务:库存服务部署在了5台机器上
Ribbon就是专门解决这个问题的。它的作用是负载均衡,会帮你在每次请求时选择一台机器,均匀的把 请求分发到各个机器上
出现问题:微服务架构中的服务雪崩问题
这个组件是负责网络路由的。
组件总和
流程
Spring Cloud 包含很多子项目: Netflix 和 Alibaba 两个标准使用最多
针对多种 Netflix 组件提供的开发工具包,其中包括 Eureka、Ribbon、Feign、Hystrix、Zuul、 Archaius 等。
Nacos 单节点,也就是 standalone 模式,默认使用嵌入式数据库实现数据的存储 不方便观察数据存储的基本情况,在0.7 版本以后增加了支持 MySQL 数据源能力。 集群搭建的时候需要将 Nacos 对接 Mysql 进行数据存储。
如果要搭建高可用的集群环境,至少要满足以下条件:
JDK 1.8+;
Maven 3.2.x+;
MySQL 5.6.5+(生产使用建议至少主备模式,或者采用高可用数据库);
3个或3个以上Nacos节点才能构成集群;
# db mysql
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=1234
4.0.0
com.jmh
springcloud01
1.0-SNAPSHOT
pom
nacos_provider
nacos_consumer
springcloud01 Maven Webapp
http://www.example.com
UTF-8
1.7
1.7
2.4.1
2020.0.0
2021.1
org.springframework.boot
spring-boot-starter-test
org.springframework.boot
spring-boot-starter-web
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.cloud
spring-cloud-starter-openfeign
org.projectlombok
lombok
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring-cloud-alibaba.version}
pom
import
packing:(打包类型,默认为jar)
pom : 父级项目(pom项目里没有java代码,也不执行任何代码,只是为了聚合工程或传递依赖用的)
jar : 内部调用或者是作服务使用
war : 需要部署的项目
dependencyManagement:(管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号) dependencyManagement与dependencies区别: dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继 承)
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依 赖。 如果不在子项目中声明依赖,是不会从父项目中继承下来的。 只有在子项目中写了了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和 scope都读取自父pom。 另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。modules(用来管理同个项目中的各个模块)
导入三个版本的原因:
nacos来自Spring Cloud Alibaba的(用于代替SpringCloud Eureka和SpringCloud Config) feign来自Spring Cloud 其他的正常来自与SpringBoot
4.0.0
com.jmh
nacos_provider
0.0.1-SNAPSHOT
nacos_provider
Demo project for Spring Boot
1.8
springcloud01
com.jmh
1.0-SNAPSHOT
org.springframework.boot
spring-boot-maven-plugin
server:
port: 8081
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848
application:
name: nacos-provider
package com.jmh.nacos_provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
4.0.0
com.jmh
nacos_consumer
0.0.1-SNAPSHOT
nacos_consumer
Demo project for Spring Boot
1.8
springcloud01
com.jmh
1.0-SNAPSHOT
org.springframework.boot
spring-boot-maven-plugin
server:
port: 8082
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848
application:
name: nacos-consumer
package com.jmh.nacos_consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
}
package com.jmh.nacos_provider.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 蒋明辉
* @data 2022/11/2 22:13
*/
@RestController
public class ProviderController {
@RequestMapping("/run")
public String run(){
//生产鸡腿
return "鸡腿";
}
}
org.springframework.cloud
spring-cloud-loadbalancer
ribbon状态:停止更新
替代方案:Spring Cloud Loadbalancer
package com.jmh.nacos_consumer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @author 蒋明辉
* @data 2022/11/2 22:14
*/
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/run")
public String run(){
//问生产者要鸡腿
String forObject = restTemplate.
getForObject("http://nacos-provider/run", String.class);
return forObject;
}
}
package com.jmh.nacos_consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}