作者:低调小熊猫 \
起源:https://ilovey.live/2021/09/2...
Spring Cloud 从H版本之后命名形式改为2020.x.x,话说为毛最新版本不是2021命名,来自强迫症的好受
应用组件列表:
- 注册核心:nacos,代替计划eureka、consul、zookeeper
- 配置核心: nacos ,代替计划sc config、consul config
- 调用:feign,代替计划:resttempate
- 熔断:sentinel、,代替计划:Resilience4j
- 熔断监控:sentinel dashboard
- 负载平衡:sc loadbalancer
- 网关:spring cloud gateway
- 链路:spring cloud sleuth+zipkin,代替计划:skywalking等
总体架构图
版本关系
应用nacos作为注册核心和配置核心
下载nacos
下载地址:https://github.com/alibaba/nacos
导入数据库
创立mysql数据库nacos,导入 conf/nacos-mysql.sql
配置数据库
批改 conf/application.properties
#*************** Config Module Related Configurations ***************#### If use MySQL as datasource:spring.datasource.platform=mysql### Count of DB:db.num=1### Connect URL of DB:db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTCdb.user.0=rootdb.password.0=123456
配置启动模式
将nacos设为单机模式启动,编辑 bin/startup.cmd 将MODE
批改为:
set MODE="standalone"
启动运行
登陆页面:http://localhost:8848/nacos/,登陆用户nacos,登陆密码为nacos
工程案例
工程案例源码:https://github.com/java-aoden...
工程案例包含2个,一个服务提供者provider 、服务消费者consumer
Spring Boot 根底就不介绍了,举荐下这个实战教程:
https://www.javastack.cn/cate...
在父pom文件引入相干的依赖,如下:
<properties> <java.version>1.8</java.version> <spring-boot.version>2.4.4</spring-boot.version> <spring-cloud.version>2020.0.2</spring-cloud.version> <spring-cloud-alibaba.version>2020.0.RC1</spring-cloud-alibaba.version></properties><dependencyManagement> <dependencies> <!-- spring boot 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- spring cloud 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- spring cloud alibaba 依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement>
服务提供者provider
在pom文件引入以下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
配置文件:
server: port: 8762spring: application: name: provider cloud: nacos: discovery: server-addr: 127.0.0.1:8848
启动入口增加注解:
@SpringBootApplication@EnableDiscoveryClientpublic class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class,args); }}
写个接口:
@RestControllerpublic class DemoController { @Value("${server.port}") String port; @GetMapping("getInfo") public String getInfo(@RequestParam(value = "name",defaultValue = "nacosConfig",required = false)String name){ return "my name is "+name+",my port is "+port; }}
服务消费者consumer
在pom文件引入以下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--引入openfeign,必须要引入loadbalancer,否则无奈启动--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
配置文件
server: port: 8763spring: application: name: consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848
在工程的启动入口开启FeignClient的性能
@SpringBootApplication@EnableDiscoveryClient@EnableFeignClientspublic class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class,args); }}
写一个FeignClient,去调用provider服务的接口:
@FeignClient(value = "provider")public interface ProviderClient { @GetMapping("getInfo") String getInfo(@RequestParam(value = "name",defaultValue = "nacosConfig",required = false)String name);}
写一个接口,让consumer去调用provider服务的接口:
@RestControllerpublic class DemoController { @Autowired ProviderClient providerClient; @GetMapping("getInfoByFeign") public String getInfoByFeign(){ return providerClient.getInfo("consumer feign"); }}
启动两个工程,在nacos服务列表页面呈现,consumer,provider2个服务示意都曾经注册胜利
服务调用
举荐一个 Spring Boot 基础教程及实战示例:
https://www.javastack.cn/cate...
在浏览器上输出http://localhost:8763/getInfo...,浏览器返回响应
my name is consumer feign,my port is 8761
可见浏览器的申请胜利调用了consumer服务的接口,consumer服务也胜利地通过feign胜利的调用了provider服务的接口。
应用sc loadbanlancer作为负载平衡
应用spring cloud loadbanlancer作为负载均衡器。 通过批改provider的端口,再在本地启动一个新的provider服务,那么本地有2个provider 服务,端口别离为8761 和8762。在浏览器上屡次调用http://localhost:8763/getInfo...,浏览器会交替显示:
my name is consumer feign,my port is 8761my name is consumer feign,my port is 8762
注册核心provider服务也会显示两个示例
应用nacos作为配置核心
父工程增加nacos配置版本,另一个是用来解决最新版本导致的问题:
<alibaba.nacos.version>2.0.3</alibaba.nacos.version><spring-cloud.bootstrap.version>3.0.4</spring-cloud.bootstrap.version> <!--Alibaba Nacos 配置--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>${spring-cloud-alibaba.version}</version> </dependency> <!--引入这个依赖解决SpringCloud2020整合Nacos-Bootstrap配置不失效的问题--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> <version>${spring-cloud.bootstrap.version}</version> </dependency>
服务提供者provider增加依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>
在bootstrap.yml(肯定是bootstrap.yml文件,不是application.yml文件)文件配置以下内容:
server: port: 8762spring: application: name: provider cloud: nacos: config: enabled: true server-addr: 127.0.0.1:8848 file-extension: yml prefix: provider profiles: active: dev
在下面的配置中,配置了nacos config server的地址,配置的扩展名是ymal(目前仅反对yml和properties)。留神是没有配置server.port的,sever.port的属性在nacos中配置。下面的配置是和Nacos中的dataId 的格局是对应的,nacos的残缺格局如下:
${prefix}-${spring.profile.active}.${file-extension}
- prefix 默认为 spring.application.name 的值,也能够通过配置项 spring.cloud.nacos.config.prefix来配置。
- spring.profile.active 即为以后环境对应的 profile,详情能够参考 Spring Boot文档。 留神:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格局变成 ${prefix}.${file-extension}
- file-exetension 为配置内容的数据格式,能够通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只反对 properties 和 yaml 类型。
启动nacos,登陆localhost:8848/nacos,创立一个data id ,残缺的配置如图所示:
源码下载:
https://github.com/java-aoden...
参考资料:
https://www.fangzhipeng.com/s... \
https://spring.io/projects/sp... \
https://www.springcloud.cc/ \
https://blog.csdn.net/lllllll...
近期热文举荐:
1.1,000+ 道 Java面试题及答案整顿(2021最新版)
2.别在再满屏的 if/ else 了,试试策略模式,真香!!
3.卧槽!Java 中的 xx ≠ null 是什么新语法?
4.Spring Boot 2.5 重磅公布,光明模式太炸了!
5.《Java开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞+转发哦!