单体架构: 将业务的所有功能集中在一个项目中开发,打成一个包部署。
单体架构的优缺点:
优点:
缺点:
微服务架构: 根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,作为一个服务。
微服务架构的优缺点:
优点:
缺点:
由于 Spring Boot 3.0,Spring Boot 2.7~2.4 和 2.4 以下版本之间变化较大,目前企业级客户老项目相关 Spring Boot 版本仍停留在 Spring Boot 2.4 以下,为了同时满足存量用户和新用户不同需求,社区以 Spring Boot 3.0 和 2.4 分别为分界线,同时维护 2022.x、2021.x、2.2.x 三个分支迭代。如果不想跨分支升级,如需使用新特性,请升级为对应分支的新版本。
适配 Spring Boot 3.0,Spring Cloud 2022.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记): (注意,该分支 Spring Cloud Alibaba 版本命名方式进行了调整,未来将对应 Spring Cloud 版本,前三位为 Spring Cloud 版本,最后一位为扩展版本,比如适配 Spring Cloud 2022.0.0 版本对应的 Spring Cloud Alibaba 第一个版本为:2022.0.0.0,第个二版本为:2022.0.0.1,依此类推)
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2022.0.0.0-RC* | Spring Cloud 2022.0.0 | 3.0.0 |
适配 Spring Boot 2.4,Spring Cloud 2021.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2021.0.4.0* | Spring Cloud 2021.0.4 | 2.6.11 |
2021.0.1.0 | Spring Cloud 2021.0.1 | 2.6.3 |
2021.1 | Spring Cloud 2020.0.1 | 2.4.2 |
适配 Spring Boot 为 2.4,Spring Cloud Hoxton 版本及以下的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2.2.10-RC1* | Hoxton.SR12 | 2.3.12.RELEASE |
2.2.9.RELEASE | Hoxton.SR12 | 2.3.12.RELEASE |
2.2.8.RELEASE | Hoxton.SR12 | 2.3.12.RELEASE |
2.2.7.RELEASE | Hoxton.SR12 | 2.3.12.RELEASE |
2.2.6.RELEASE | Hoxton.SR9 | 2.3.2.RELEASE |
2.2.1.RELEASE | Hoxton.SR3 | 2.2.5.RELEASE |
2.2.0.RELEASE | Hoxton.RELEASE | 2.2.X.RELEASE |
2.1.4.RELEASE | Greenwich.SR6 | 2.1.13.RELEASE |
2.1.2.RELEASE | Greenwich | 2.1.X.RELEASE |
2.0.4.RELEASE(停止维护,建议升级) | Finchley | 2.0.X.RELEASE |
1.5.1.RELEASE(停止维护,建议升级) | Edgware | 1.5.X.RELEASE |
每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本如下表所示(注意,Spring Cloud Dubbo 从 2021.0.1.0 起已被移除出主干,不再随主干演进):
Spring Cloud Alibaba Version | Sentinel Version | Nacos Version | RocketMQ Version | Dubbo Version | Seata Version |
---|---|---|---|---|---|
2.2.10-RC1 | 1.8.6 | 2.2.0 | 4.9.4 | ~ | 1.6.1 |
2022.0.0.0-RC1 | 1.8.6 | 2.2.1-RC | 4.9.4 | ~ | 1.6.1 |
2.2.9.RELEASE | 1.8.5 | 2.1.0 | 4.9.4 | ~ | 1.5.2 |
2021.0.4.0 | 1.8.5 | 2.0.4 | 4.9.4 | ~ | 1.5.2 |
2.2.8.RELEASE | 1.8.4 | 2.1.0 | 4.9.3 | ~ | 1.5.1 |
2021.0.1.0 | 1.8.3 | 1.4.2 | 4.9.2 | ~ | 1.4.2 |
2.2.7.RELEASE | 1.8.1 | 2.0.3 | 4.6.1 | 2.7.13 | 1.3.0 |
2.2.6.RELEASE | 1.8.1 | 1.4.2 | 4.4.0 | 2.7.8 | 1.3.0 |
2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE | 1.8.0 | 1.4.1 | 4.4.0 | 2.7.8 | 1.3.0 |
2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE | 1.8.0 | 1.3.3 | 4.4.0 | 2.7.8 | 1.3.0 |
2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE | 1.7.1 | 1.2.1 | 4.4.0 | 2.7.6 | 1.2.0 |
2.2.0.RELEASE | 1.7.1 | 1.1.4 | 4.4.0 | 2.7.4.1 | 1.0.0 |
2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE | 1.7.0 | 1.1.4 | 4.4.0 | 2.7.3 | 0.9.0 |
2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE | 1.6.3 | 1.1.1 | 4.4.0 | 2.7.3 | 0.7.1 |
最早使用SpringCloud版本的时候,直接将查找出来的版本当作version放在dependency中,导致maven导包的时候一直报包找不到的错误,后经查阅发现SpringCloud Version是要放在dependencyManagement中进行统一管理的。
最佳使用方式:
先创建一个父工程,并在父工程的pom中将改成pom的形式,如下所示:
<groupId>com.examplegroupId>
<artifactId>my-cloud-demoartifactId>
<packaging>pompackaging>
<version>0.0.1version>
然后新建子模块后,把子模块统一加入父工程modules管理,如下所示:
<modules>
<module>order-servicemodule>
<module>user-servicemodule>
<module>eureka-servermodule>
modules>
这样子模块就可以导入父工程所引入的依赖了。
最后在dependencyManagement中添加如下,此处的spring-boot.version及spring-cloud.version均可以在如上的依赖关系表中查到:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${spring-boot.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
首先配置eureka-server注册中心:
spring:
application:
name: eureka-server
# 微服务的端口
server:
port: 8050
eureka:
# ip地址,不配的话默认为localhost
instance:
hostname: localhost
client:
# 是否将自己注册到注册中心
register-with-eureka: false
# 是否从eureka中获取注册信息
fetch-registry: false
# 配置暴露给Eureka Client的请求地址
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
然后在eureka-server的主启动类上加入 @EnableEurekaServer的注解。
配置eureka-client客户端:
spring:
application:
name: order-service
# 微服务的端口
server:
port: 8070
eureka:
client:
service-url:
# 添加Eureka Server的主机地址
defaultZone: http://127.0.0.1:8050/eureka
instance:
# 默认服务端每隔30s向注册中心发送一次心跳,此处更改发送间隔为10s
lease-renewal-interval-in-seconds: 10
# 续约到期时间,若超过该时间注册中心未收到服务的心跳,则认为续约到期
lease-expiration-duration-in-seconds: 20
# 使用ip注册
prefer-ip-address: true
# 注册的ID使用ip
instance-id: ${spring.cloud.client.ip-address}:${server.port}
# 开启健康检查,需要引入actuator依赖
healthcheck.enabled: true
开启健康检查需导入actuator依赖:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
然后在eureka-server的主启动类上加入 @EnableEurekaClient的注解。
具体配置控制在eureka页面上显示如下:
Ribbon主要用来实现负载均衡功能。
如在order-service中需对调用user-service服务的行为进行负载均衡,配置如下:
user-service:
ribbon:
# Ribbon的连接超时时间
ConnectTimeout: 250
# Ribbon的数据读取超时时间
ReadTimeout: 1000
# 是否对所有操作都进行重试,需要引入spring-retry依赖
OkToRetryOnAllOperations: true
# 切换实例的重试次数
MaxAutoRetriesNextServer: 1
# 对当前实例的重试次数
MaxAutoRetries: 1
# 负载均衡方式,默认是轮询的负载均衡策略(com.netflix.loadbalancer.RoundRobinRule)
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule
添加重试机制,需要导入spring-retry依赖:
<dependency>
<groupId>org.springframework.retrygroupId>
<artifactId>spring-retryartifactId>
dependency>
然后在RestTemplate注册类上添加@LoadBalance注解,如P5所示。
Ribbon内置的7种负载均衡方式:
内置负载均衡规则类 | 规则描述 |
---|---|
com.netflix.loadbalancer.RoundRobinRule | 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
com.netflix.loadbalancer.AvailabilityFilteringRule | 对以下两种服务器进行忽略:(1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。(2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的..ActiveConnectionsLimit属性进行配置。 |
com.netflix.loadbalancer.WeightedResponseTimeRule | 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
com.netflix.loadbalancer.ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。 |
com.netflix.loadbalancer.BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器。 |
com.netflix.loadbalancer.RandomRule | 随机选择一个可用的服务器。 |
com.netflix.loadbalancer.RetryRule | 重试机制的选择逻辑 |
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true
clients: user-service
RestTemplate主要用于RESTFUL风格的接口请求,使用HTTP协议。
使用方法,在服务消费者的主启动类中进行RestTemplate的Bean注册,如在order-service中进行注册:
@SpringBootApplication
@EnableEurekaClient
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
RestTemplate Bean的主要使用方法有以下:
方法名称 | 方法用途 |
---|---|
getForObject(URI url, Class responseType) | GET方式请求,responseType为返回的类型 |
postForObject(URI url, Object request, Class responseType) | POST方式请求,request为请求体,responseType为返回的类型 |
其它的方法需要使用时进行查询。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
CREATE DATABASE `nacos` CHARACTER SET utf8mb4;
set MODE="standalone"
在父工程的dependencyManagement中添加spring-cloud-alibaba依赖管理,如下所示:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring-cloud-alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
然后在服务模块的pom文件中引入nacos-discovery依赖:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
注意:eureka的依赖要注释掉。
在服务模块的application.yml中添加以下配置:
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 实例发送心跳的间隔时间。(单位:毫秒)
heart-beat-interval: 5000
# 该实例不发送心跳后,从健康到不健康的时间。(单位:毫秒)
heart-beat-timeout: 15000
# 该实例在不发送心跳后,被nacos下掉该实例的时间。(单位:毫秒)
ip-delete-timeout: 30000
一个服务可以有多个实例,例如user-service,可以有:
假如这些实例分布于全国各地的不同机房,例如:
Nacos就将同一机房内的实例划分为一个集群。
也就是说,user-service是服务,一个服务可以包含多个集群,如杭州、上海,每个集群下可以有多个实例,形成分级模型,如图:
微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如:
杭州机房内的order-service应该优先访问同机房的user-service。
给服务模块的application.yml中添加集群配置,如下所示:
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 实例发送心跳的间隔时间。(单位:毫秒)
heart-beat-interval: 5000
# 该实例不发送心跳后,从健康到不健康的时间。(单位:毫秒)
heart-beat-timeout: 15000
# 该实例在不发送心跳后,被nacos下掉该实例的时间。(单位:毫秒)
ip-delete-timeout: 30000
# 集群名字
cluster-name: HZ
可以在nacos界面上看到服务在HZ集群下:
如果想要优先调用同集群下的服务,可以将负载均衡策略换成Nacos
的NacosRule
。Nacos
中提供了一个NacosRule
的实现,可以优先从同集群中挑选实例。
user-service:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。
但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。
因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:
权重越大,实例被访问的概率就越大。如果权重为0,实例则永远不会被访问。
Nacos提供了namespace来实现环境隔离功能。
默认情况下,所有service、data、group都在同一个namespace,名为public:
我们可以点击页面新增按钮,添加一个namespace:
然后,填写表单:
就能在页面看到一个新的namespace:
同时,在配置的nacos数据库下的tenant_info表中也可以看到新增的命名空间信息:
给微服务配置namespace只能通过修改配置来实现。
例如,修改order-service的application.yml文件:
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 实例发送心跳的间隔时间。(单位:毫秒)
heart-beat-interval: 5000
# 该实例不发送心跳后,从健康到不健康的时间。(单位:毫秒)
heart-beat-timeout: 15000
# 该实例在不发送心跳后,被nacos下掉该实例的时间。(单位:毫秒)
ip-delete-timeout: 30000
# 集群名字
cluster-name: HZ
# 命名空间,填ID
namespace: d089ab10-7afd-4d02-bd2a-94eacc631ed9
不同命名空间相互隔离,服务之间无法相互访问。
Nacos的服务实例分为两种类型:
配置一个服务实例为永久实例:
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为非临时实例
Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:
Nacos与eureka的共同点
Nacos与Eureka的区别
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.examplegroupId>
<artifactId>my-cloud-demoartifactId>
<packaging>pompackaging>
<version>0.0.1version>
<name>my-cloud-demoname>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<spring-boot.version>2.2.6.RELEASEspring-boot.version>
<spring-cloud.version>Hoxton.RELEASEspring-cloud.version>
<spring-cloud-alibaba.version>2.2.0.RELEASEspring-cloud-alibaba.version>
properties>
<modules>
<module>order-servicemodule>
<module>user-servicemodule>
<module>eureka-servermodule>
modules>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-jpaartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${spring-boot.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring-cloud-alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.8.1version>
<configuration>
<source>1.8source>
<target>1.8target>
<encoding>UTF-8encoding>
configuration>
plugin>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>${spring-boot.version}version>
<configuration>
<mainClass>com.example.myclouddemo.MyCloudDemoApplicationmainClass>
<skip>trueskip>
configuration>
<executions>
<execution>
<id>repackageid>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
plugins>
build>
project>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<artifactId>eureka-serverartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>eureka-servername>
<description>Demo project for Spring Bootdescription>
<parent>
<groupId>com.examplegroupId>
<artifactId>my-cloud-demoartifactId>
<version>0.0.1version>
<relativePath>../../my-cloud-demorelativePath>
parent>
<properties>
<java.version>1.8java.version>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
dependencies>
project>
spring:
application:
# 微服务的名称
name: eureka-server
# 微服务的端口
server:
port: 8050
eureka:
# ip地址,不配的话默认为localhost
instance:
hostname: localhost
client:
# 是否将自己注册到注册中心
register-with-eureka: false
# 是否从eureka中获取注册信息
fetch-registry: false
# 配置暴露给Eureka Client的请求地址
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
package com.example.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.examplegroupId>
<artifactId>order-serviceartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>order-servicename>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
properties>
<parent>
<groupId>com.examplegroupId>
<artifactId>my-cloud-demoartifactId>
<version>0.0.1version>
<relativePath>../../my-cloud-demorelativePath>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.retrygroupId>
<artifactId>spring-retryartifactId>
dependency>
dependencies>
project>
spring:
application:
name: order-service
datasource:
url: jdbc:mysql://127.0.0.1:3306/cloud-demo?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
hibernate:
ddl-auto: update
show-sql: true
database: MYSQL
database-platform: org.hibernate.dialect.MySQL5Dialect
server:
port: 8070
eureka:
client:
service-url:
# 添加Eureka Server的主机地址
defaultZone: http://127.0.0.1:8050/eureka
instance:
# 默认服务端每隔30s向注册中心发送一次心跳,此处更改发送间隔为10s
lease-renewal-interval-in-seconds: 10
# 续约到期时间,若超过该时间注册中心未收到服务的心跳,则认为续约到期
lease-expiration-duration-in-seconds: 20
# 使用ip注册
prefer-ip-address: true
# 注册的ID使用ip
instance-id: ${spring.cloud.client.ip-address}:${server.port}
# 开启健康检查,需要引入actuator依赖
healthcheck.enabled: true
# 调用服务的名称,并设定负载均衡策略
user-service:
ribbon:
# Ribbon的连接超时时间
ConnectTimeout: 250
# Ribbon的数据读取超时时间
ReadTimeout: 1000
# 是否对所有操作都进行重试,需要引入spring-retry依赖
OkToRetryOnAllOperations: true
# 切换实例的重试次数
MaxAutoRetriesNextServer: 1
# 对当前实例的重试次数
MaxAutoRetries: 1
# 负载均衡方式,默认是轮询的负载均衡策略(com.netflix.loadbalancer.RoundRobinRule)
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
package com.example.orderservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableEurekaClient
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.examplegroupId>
<artifactId>order-serviceartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>order-servicename>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
properties>
<parent>
<groupId>com.examplegroupId>
<artifactId>my-cloud-demoartifactId>
<version>0.0.1version>
<relativePath>../../my-cloud-demorelativePath>
parent>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.retrygroupId>
<artifactId>spring-retryartifactId>
dependency>
dependencies>
project>
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 集群名称
cluster-name: SH
# 命名空间
namespace: d089ab10-7afd-4d02-bd2a-94eacc631ed9
# 实例发送心跳的间隔时间。(单位:毫秒)
heart-beat-interval: 5000
# 该实例不发送心跳后,从健康到不健康的时间。(单位:毫秒)
heart-beat-timeout: 15000
# 该实例在不发送心跳后,被nacos下掉该实例的时间。(单位:毫秒)
ip-delete-timeout: 30000
application:
name: order-service
datasource:
url: jdbc:mysql://127.0.0.1:3306/cloud-demo?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
hibernate:
ddl-auto: update
show-sql: true
database: MYSQL
database-platform: org.hibernate.dialect.MySQL5Dialect
server:
port: 8070
# 调用服务的名称,并设定负载均衡策略
user-service:
ribbon:
# Ribbon的连接超时时间
ConnectTimeout: 250
# Ribbon的数据读取超时时间
ReadTimeout: 1000
# 是否对所有操作都进行重试,需要引入spring-retry依赖
OkToRetryOnAllOperations: true
# 切换实例的重试次数
MaxAutoRetriesNextServer: 1
# 对当前实例的重试次数
MaxAutoRetries: 1
# 负载均衡方式
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
package com.example.orderservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}