1 使用Nacos作为注册中心和配置中心
1.1 注册中心
1.1.1 下载nacos并以standalone模式启动
- 下载
下载地址
- 进入到bin目录,启动nacos
startup.cmd -m standalone
- 访问
http://127.0.0.1:8848/nacos
用户名:nacos 密码:nacos
1.1.2 建立项目
- 建立mavne父工程
- 建立两个子工程
1.1.3 服务提供者
- pom依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- controller接口
@EnableDiscoveryClient
@RestController
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
@Value("${server.port}")
public String port;
@GetMapping("/hello")
public String hi(@RequestParam(value = "name", defaultValue = "world",required = false) String name) {
return "hello " + name + ", my port is : " + port;
}
}
- application.yml配置文件
server:
port: 9999
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
1.1.4 服务消费者
- pom文件
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
- 服务调用接口
@FeignClient(value = "nacos-provider") // 服务提供者服务名
public interface ProviderClient {
@GetMapping(value = "/hello")
String hello(@RequestParam(value = "name",defaultValue = "world",required = false)String name);
}
- controller接口
@RestController
public class HelloController {
@Autowired
private ProviderClient client;
@GetMapping(value = "/hi-feign/{name}")
public String hiFeign(@PathVariable(value = "name")String name) {
return client.hello(name);
}
}
- yml配置
server:
port: 10001
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
- 注解
@EnableDiscoveryClient // 让注册中心能够发现,扫描到该服务
@EnableFeignClients // 声明该项目是Feign客户端
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
1.1.5 多个服务提供者并行运行
1.1.6 查看效果
1.2 配置中心
1.2.1 添加依赖
<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>
<!--说明:spring-cloud-dependencies 2020.0.0 版本不在默认加载bootstrap 文件,如果需要加载bootstrap 文件需要手动添加依赖-->
<!--https://blog.csdn.net/wyz0923/article/details/118303072-->
1.2.2 bootstrap.yml配置文件
spring:
application:
name: nacos-provider
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # nacos服务地址
file-extension: yaml # nacos配置扩展名,后缀 (目前仅支持ymal和properties)
prefix: nacos-provider # nacos 配置文件前缀
profiles:
active: dev
${prefix}-${spring.profile.active}.${file-extension}
# 加载顺序:bootstrap.yml > application.yml
1.2.3 在nacos中创建配置文件
1.2 4 编写Controller
@RestController
@RefreshScope // 实现配置热加载
public class ConfigController {
@Value("${username}")
private String username;
@GetMapping("/username")
public String getUsername() {
return username;
}
}
2 使用Gateway作为网关
2.1 导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2.2 yml配置文件
server:
port: 10001
spring:
application:
name: cloud-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: false
lowerCaseServiceId: true
routes:
- id: provider
uri: lb://nacos-provider
predicates:
- Path=/nacos-provider/**
filters:
- StripPrefix=1
- id: consumer
uri: lb://nacos-consumer
predicates:
- Path=/nacos-consumer/**
filters:
- StripPrefix=1
2.3 查看
3 sentinel作为熔断器
- 丰富的应用场景
- 完备的实时监控
- 广泛的开源生态
- 完善的SPI扩展点
3.1 Sentinel dashboard
-
下载
-
启动
java -Dserver.port=8748 -Dcsp.sentinel.dashboard.server=localhost:8748 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
- 访问
地址 sentinel/sentinel
3.2 修改服务消费者
- pom文件
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- 修改配置文件
server:
port: 20001
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # nacos服务地址
sentinel:
transport:
port: 18763 # 指定应用与控制台交互的端口,应用本地会起一个该端口占用HttpServer
dashboard: 127.0.0.1:8748 # sentinel的dashboard地址
feign:
sentinel:
enabled: true # 开启fengn的sentinel自动适配
- 访问接口,查看sentinel dashboard
接口
- 接口增加qps
快速访问会出现以上结果
3.3 gateway使用Sentinel
- 添加依赖
<!--Spring cloud gateway已经适配了sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
- 修改配置文件
server:
port: 10001
spring:
cloud:
gateway:
discovery:
locator:
enabled: false
lowerCaseServiceId: true
routes:
- id: provider
uri: lb://nacos-provider
predicates:
- Path=/nacos-provider/**
filters:
- StripPrefix=1
- id: consumer
uri: lb://nacos-consumer
predicates:
- Path=/nacos-consumer/**
filters:
- StripPrefix=1
sentinel:
transport:
port: 18798
dashboard: 127.0.0.1:8748
- 创建网关分组限流规则
参考
package com.example.gateway.config;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter;
import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.result.view.ViewResolver;
import javax.annotation.PostConstruct;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Configuration
public class GatewayConfiguration {
private final List<ViewResolver> viewResolvers;
private final ServerCodecConfigurer serverCodecConfigurer;
public GatewayConfiguration(ObjectProvider<List<ViewResolver>> viewResolversProvider,
ServerCodecConfigurer serverCodecConfigurer) {
this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
this.serverCodecConfigurer = serverCodecConfigurer;
}
/**
* 配置限流的异常处理
* @return
*/
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
// Register the block exception handler for Spring Cloud Gateway.
return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
}
/**
* 配置初始化的限流参数
*/
public void initGatewayRules() {
Set<GatewayFlowRule> rules = new HashSet<>();
rules.add(new GatewayFlowRule("nacos-consumer")
.setCount(1).setIntervalSec(1));
rules.add(new GatewayFlowRule("nacos-provider")
.setCount(1).setIntervalSec(1));
GatewayRuleManager.loadRules(rules);
}
/**
* 初始化限流过滤器
* @return
*/
@Bean
@Order(-1)
public GlobalFilter gatewayFilter() {
return new SentinelGatewayFilter();
}
@PostConstruct
public void doInit() {
initCustomizedApis();
initGatewayRules();
}
/**
* 自定义API分组
*/
private void initCustomizedApis() {
Set<ApiDefinition> definitions = new HashSet<>();
ApiDefinition api1 = new ApiDefinition("nacos-consumer")
.setPredicateItems(new HashSet<ApiPredicateItem>() );
ApiDefinition api2 = new ApiDefinition("nacos-provider")
.setPredicateItems(new HashSet<ApiPredicateItem>() );
definitions.add(api1);
definitions.add(api2);
GatewayApiDefinitionManager.loadApiDefinitions(definitions);
}
}
- 增加qps
4 Sleuth+Zipkin实现链路追踪
4.1 Zipkin
- 下载
地址
- 启动
java -jar zipkin-server-2.23.16-exec.jar
- 访问
http://localhost:9411
4.2 修改项目
- 添加依赖
每个工程的pom文件中加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
- 修改配置文件
在配置文件中添加如下内容:
spring:
sleuth:
sampler:
probability: 1 # 采样率 probability低版本参数 高版本为 rate
zipkin:
sender:
type: web
service:
name: nacos-provider
base-url: http://127.0.0.1:9411/
- 测试
5 Spring Boot Admin
5.1 建立admin-server项目
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.6.2</version>
</dependency>
- 启动类上添加注解
@EnableAdminServer // 开启AdminServer功能
- 编写配置文件
server:
port: 30001
spring:
application:
name: admin-server
5.2 建立admin-client项目
在之前的基础上稍作修改
- 依赖
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 修改配置文件
spring:
boot:
admin:
client:
url: http://127.0.0.1:30001
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
- 启动查看效果
点击应用墙可以查看具体信息
5 附录
5.1 springcloud版本管理
- 版本对照
Finchey | 2.0.x | 2.0.x |
---|---|---|
Release Train | Boot Version | Spring Cloud alibaba version |
2020.0.x | 2.4.x | 2021.1 |
Hoxton | 2.2.x,2.3.x | 2.2.x |
Greenwich | 2.1.x | 2.1.x |
Edgware | 1.5.x | 1.5.x |
Dalston | 1.5.x | 1.5.x |
- 本文使用springcloud和springcloud-alibaba版本
<!--spring boot-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<!--spring cloud dependencies-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba dependencies-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 父级pom文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.example</groupId>
<artifactId>learn1</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<java.version>1.8</java.version>
</properties>
<packaging>pom</packaging>
<modules>
<module>provider</module>
<module>consumer</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>