SpringCloud微服务教程介绍了基于SpringBoot的微服务框架SpringCloud,涵盖了服务发现、负载均衡、配置中心、断路器等核心概念,并详细讲解了如何搭建和配置微服务环境。文章还深入探讨了SpringCloud的核心组件及其应用场景,帮助开发者快速上手并优化微服务架构。
SpringCloud简介什么是SpringCloud
SpringCloud是一个基于SpringBoot的微服务框架。它通过一系列的微服务组件提供配置管理、服务发现、断路器、路由、微服务批量管理等功能。SpringCloud旨在简化分布式系统的构建、部署、运行、维护和监控。它提供了多种分布式系统基础服务,如配置中心、服务发现与注册等,且大部分基于SpringBoot,易于集成和使用。
SpringCloud的核心概念
SpringCloud的核心概念包括:
- 服务发现与注册:通过服务发现与注册,微服务可以根据服务名称来查找其他服务实例,而不是通过IP地址和端口号。服务注册中心负责维护服务实例的信息。
- 负载均衡:负载均衡技术用于改善系统性能和提高可靠性。通过负载均衡,服务请求可以均匀地分配到服务集群的各个节点上,避免单一节点过载。
- 配置中心:配置中心允许开发者集中管理和分发应用程序的配置信息。配置信息可以是各种环境变量、数据库连接信息等。
- 断路器:断路器模式用于检测某个服务是否可用。如果发现调用失败的次数达到一定阈值,断路器会自动切换到“断开”状态,不再调用该服务,避免继续调用失败的服务。
- 服务网关:服务网关作为整个系统的唯一入口,负责将外部请求路由到合适的微服务上,并对请求进行必要的处理,如身份验证、限流等。
SpringCloud的优势与应用场景
SpringCloud的优势包括:
- 简化分布式系统构建:SpringCloud提供了一整套的微服务框架,简化了分布式系统的开发,使开发者能够专注于业务逻辑。
- 快速集成:基于SpringBoot,使得服务的快速集成变得简单。
- 开箱即用:SpringCloud提供了许多组件,如服务发现、负载均衡等,都实现了开箱即用的功能。
- 生态丰富:SpringCloud拥有丰富的生态,包括Netflix OSS和其他开源项目,集成简单,功能强大。
应用场景包括但不限于:
- 电商系统:如淘宝、京东等,需要处理大量的并发请求,采用微服务架构可以很好地应对高并发场景。
- 金融系统:金融系统对实时性和安全性有较高要求,微服务架构可以更好地保证系统的稳定性和安全性。
- 互联网应用:互联网应用需要处理大量的用户请求,微服务架构可以有效地提高系统的扩展性和灵活性。
开发环境准备
开发一个SpringCloud微服务应用,首先需要准备开发环境。以下是所需软件工具:
- Java SDK:开发SpringCloud应用需要Java环境,建议使用Java 8或更高版本。
- IDE:推荐使用IntelliJ IDEA或Eclipse等IDE进行开发。
- Git:版本控制工具,用于代码版本管理。
- Maven:依赖管理工具,用于管理项目依赖。
- Docker:容器化工具,用于服务的快速部署和隔离。
Maven依赖配置
在开发SpringCloud应用时,需要在Maven项目的pom.xml
文件中添加相应的依赖。下面是一个基本的SpringCloud项目依赖配置示例:
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>springcloud</artifactId>
<version>1.0.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
服务器与工具安装
安装服务器与工具包括:
- Tomcat:用作应用服务器,可以使用SpringBoot内置的Tomcat,也可以部署到外部的Tomcat服务器。
- Eureka Server:用于服务注册和发现。Eureka Server是一个基于REST的服务,主要用于服务发现和负载均衡。
- Zuul:服务网关,作为系统的唯一入口,用于路由、过滤等。
- Config Server:用于集中化管理配置文件。
Eureka服务注册与发现
Eureka是Netflix开源的一个服务注册与发现组件,主要用于构建微服务架构。Eureka Server作为注册中心,维护服务注册表;服务提供者向Eureka Server注册自己,服务消费者则从Eureka Server获取服务提供者的地址,并进行服务调用。
Eureka Server配置
在Eureka Server的application.yml
配置文件中添加以下内容:
server:
port: 8761
spring:
application:
name: eureka-server
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
server: true
Eureka Service Provider配置
在服务提供者的application.yml
配置文件中添加以下内容:
spring:
application:
name: service-provider
server:
port: 8081
eureka:
instance:
hostname: localhost
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
Eureka Service Consumer配置
在服务消费者的application.yml
配置文件中添加以下内容:
spring:
application:
name: service-consumer
server:
port: 8082
eureka:
instance:
hostname: localhost
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
服务提供者与服务消费者
服务提供者通常指提供具体业务逻辑的微服务,而服务消费者则是调用服务提供者中的服务的应用程序或服务。
服务提供者实现
在服务提供者的Application.java
文件中启动服务:
package com.example.serviceprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
}
服务提供者提供一个简单的REST接口:
package com.example.serviceprovider.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class ServiceProviderController {
@GetMapping("/sayHello")
public String sayHello() {
return "Hello from Service Provider!";
}
}
服务消费者实现
在服务消费者的Application.java
文件中启动服务:
package com.example.serviceconsumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
@SpringBootApplication
@EnableEurekaClient
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
}
服务消费者调用服务提供者提供的接口:
package com.example.serviceconsumer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ServiceConsumerController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/sayHello")
public String sayHello() {
String url = loadBalancerClient.choose("service-provider").getUri().toString() + "/api/sayHello";
return restTemplate.getForObject(url, String.class);
}
}
服务注册与心跳检测机制
服务实例向Eureka Server注册时,需要提供hostname
和port
信息,并设置心跳检测周期。服务提供者定期向Eureka Server发送心跳包以保持注册信息的更新。如果超过一定时间没有发送心跳包,Eureka Server会将该服务实例标记为下线。
Ribbon负载均衡
Ribbon是Netflix开源的一个基于HTTP和TCP的客户端负载均衡器。Ribbon通过在客户端实现一系列负载均衡的策略,动态地从集群中选择一台服务进行调用。
Ribbon配置
在application.yml
文件中配置Ribbon:
spring:
application:
name: service-consumer
server:
port: 8082
eureka:
instance:
hostname: localhost
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
ribbon:
ConnectTimeout: 5000
ReadTimeout: 5000
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 1
使用Ribbon进行服务调用
package com.example.serviceconsumer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ServiceConsumerController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/sayHello")
public String sayHello() {
String url = loadBalancerClient.choose("service-provider").getUri().toString() + "/api/sayHello";
return restTemplate.getForObject(url, String.class);
}
}
Feign声明式服务调用
Feign是由Netflix开源的一个声明式HTTP客户端,它提供了一种静态的方式来编写HTTP客户端。Feign使用了Spring Cloud Netflix的Ribbon进行负载均衡。
Feign配置
在pom.xml
文件中添加Feign依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在application.yml
文件中配置Feign:
spring:
application:
name: service-consumer
server:
port: 8082
eureka:
instance:
hostname: localhost
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
使用Feign进行服务调用
定义一个Feign客户端:
package com.example.serviceconsumer.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "service-provider")
public interface ServiceProviderClient {
@GetMapping("/api/sayHello")
String sayHello();
}
在服务消费者中使用Feign客户端进行调用:
package com.example.serviceconsumer.controller;
import com.example.serviceconsumer.feign.ServiceProviderClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ServiceConsumerController {
private final ServiceProviderClient serviceProviderClient;
public ServiceConsumerController(ServiceProviderClient serviceProviderClient) {
this.serviceProviderClient = serviceProviderClient;
}
@GetMapping("/sayHello")
public String sayHello() {
return serviceProviderClient.sayHello();
}
}
Hystrix断路器
Hystrix是Netflix开源的一个延迟和容错库,用于隔离服务间的访问点,防止服务间的故障级联。Hystrix通过隔离服务间的访问点、在进程和线程间执行请求、以及提供回退机制,来防止故障扩散。
Hystrix配置
在pom.xml
文件中添加Hystrix依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
使用Hystrix进行服务调用
定义一个Hystrix命令:
package com.example.serviceconsumer.hystrix;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandProperties;
import com.netflix.hystrix.HystrixCommandKey;
import com.netflix.hystrix.HystrixCommandProperties.ExecutionIsolationStrategy;
import org.springframework.web.client.RestTemplate;
public class ServiceClientCommand extends HystrixCommand<String> {
private String serviceUrl;
public ServiceClientCommand(String serviceUrl) {
super(HystrixCommandGroupKey.Factory.asKey("ServiceClientGroup"),
HystrixCommandKey.Factory.asKey("ServiceClientCommand"),
Setter.withExecutionIsolationStrategy(ExecutionIsolationStrategy.THREAD));
this.serviceUrl = serviceUrl;
}
@Override
protected String run() throws Exception {
return new RestTemplate().getForObject(serviceUrl, String.class);
}
}
在服务消费者中使用Hystrix命令进行调用:
package com.example.serviceconsumer.controller;
import com.example.serviceconsumer.feign.ServiceProviderClient;
import com.example.serviceconsumer.hystrix.ServiceClientCommand;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ServiceConsumerController {
private final ServiceProviderClient serviceProviderClient;
public ServiceConsumerController(ServiceProviderClient serviceProviderClient) {
this.serviceProviderClient = serviceProviderClient;
}
@GetMapping("/sayHello")
public String sayHello() {
String serviceUrl = serviceProviderClient.getUrl() + "/api/sayHello";
return new ServiceClientCommand(serviceUrl).execute();
}
}
配置与状态中心
配置中心SpringCloud Config
SpringCloud Config提供了集中化配置服务,可以将配置信息统一管理,支持多种数据源,包括本地文件、svn、git等。使用SpringCloud Config,可以方便地管理微服务的配置,并实现配置的动态刷新。
Config Server配置
创建一个新的SpringBoot项目作为Config Server。在application.yml
文件中配置Config Server:
spring:
application:
name: config-server
server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: https://github.com/yourusername/yourrepo
search-paths: config-repo
Config Client配置
在微服务的application.yml
文件中配置Config Client:
spring:
application:
name: service-config-client
server:
port: 8080
spring:
cloud:
config:
name: application
profile: dev
label: master
uri: http://localhost:8888/config
使用Config Client获取配置
在微服务中通过@Value
注解注入配置:
package com.example.serviceconfigclient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class ServiceConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConfigClientApplication.class, args);
}
}
@RestController
@RefreshScope
public class ServiceConfigClientController {
@Value("${app.name}")
private String appName;
@GetMapping("/appName")
public String getApplicationName() {
return appName;
}
}
分布式跟踪SpringCloud Sleuth
SpringCloud Sleuth是Spring Cloud提供的分布式跟踪组件,用于追踪微服务之间的调用链路。Sleuth可以帮助开发者更好地理解服务之间的调用关系,以及调用过程中的一些关键信息。
Sleuth配置
在微服务的pom.xml
文件中添加Sleuth依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
在微服务的application.yml
文件中配置Sleuth:
spring:
application:
name: sleuth-service
server:
port: 8080
spring:
sleuth:
sampler:
probability: 1.0
使用Sleuth进行跟踪
在服务消费者中注入Sleuth的跟踪信息:
package com.example.servicesleuth.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ServiceSleuthController {
private final Tracer tracer;
@Autowired
public ServiceSleuthController(Tracer tracer) {
this.tracer = tracer;
}
@GetMapping("/trace")
public String trace() {
String traceId = tracer.currentSpan().context().traceIdString();
String spanId = tracer.currentSpan().context().spanIdString();
return "Trace ID: " + traceId + ", Span ID: " + spanId;
}
}
状态中心SpringCloud Bus
SpringCloud Bus是一个用于在分布式环境中传递事件的组件,它将应用解耦,使得应用可以在不重启的情况下动态地改变配置。通过SpringCloud Bus,可以实现配置的动态刷新。
Bus配置
在微服务的pom.xml
文件中添加Bus依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
在微服务的application.yml
文件中配置RabbitMQ:
spring:
application:
name: bus-service
server:
port: 8080
spring:
rabbit:
host: localhost
port: 5672
cloud:
stream:
rabbit:
bindings:
configInfo:
exchange: config-exchange
exchangeType: fanout
使用Bus进行配置刷新
在微服务中使用@RefreshScope
注解:
package com.example.servicebus;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableBinding(Sink.class)
public class ServiceBusApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceBusApplication.class, args);
}
}
@RestController
@RefreshScope
public class ServiceBusController {
@Value("${app.name}")
private String appName;
@GetMapping("/appName")
public String getApplicationName() {
return appName;
}
@StreamListener(Sink.INPUT)
public void receive(String in) {
System.out.println("Received message: " + in);
}
}
实战案例与部署
微服务项目实战
为了更好地理解微服务架构,下面是一个简单的实战案例,展示如何构建一个简单的微服务项目。该案例中包括一个Eureka Server、两个服务提供者和服务消费者。
创建Eureka Server
创建一个新的SpringBoot项目作为Eureka Server。在application.yml
文件中配置Eureka Server:
server:
port: 8761
spring:
application:
name: eureka-server
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
server: true
在Application.java
文件中启动服务器:
package com.example.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
创建服务提供者
创建一个新的SpringBoot项目作为服务提供者。在application.yml
文件中配置服务提供者:
spring:
application:
name: service-provider
server:
port: 8081
eureka:
instance:
hostname: localhost
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
在Application.java
文件中启动服务:
package com.example.serviceprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
}
服务提供者提供一个简单的REST接口:
package com.example.serviceprovider.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class ServiceProviderController {
@GetMapping("/sayHello")
public String sayHello() {
return "Hello from Service Provider!";
}
}
创建服务消费者
创建一个新的SpringBoot项目作为服务消费者。在application.yml
文件中配置服务消费者:
spring:
application:
name: service-consumer
server:
port: 8082
eureka:
instance:
hostname: localhost
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
在Application.java
文件中启动服务:
package com.example.serviceconsumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
@SpringBootApplication
@EnableEurekaClient
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
}
服务消费者调用服务提供者提供的接口:
package com.example.serviceconsumer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ServiceConsumerController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/sayHello")
public String sayHello() {
String url = loadBalancerClient.choose("service-provider").getUri().toString() + "/api/sayHello";
return restTemplate.getForObject(url, String.class);
}
}
项目部署与测试
部署项目可以通过多种方式,例如直接部署到本地开发环境、使用Docker容器化部署或部署到云平台如AWS、阿里云等。
Docker部署
构建Docker镜像:
docker build -t eurekaserver .
docker build -t service-provider .
docker build -t service-consumer .
运行Docker容器:
docker run -d --name eureka-server -p 8761:8761 eurekaserver
docker run -d --name service-provider -p 8081:8081 service-provider
docker run -d --name service-consumer -p 8082:8082 service-consumer
测试微服务:
使用浏览器访问http://localhost:8081/api/sayHello
,可以获取到服务提供者的响应。
使用浏览器访问http://localhost:8082/sayHello
,可以获取到服务消费者的响应,服务消费者会调用服务提供者并返回响应。
性能优化与监控
性能优化和监控是微服务架构中不可或缺的一部分。SpringCloud提供了多种工具和服务,帮助开发者进行性能优化和系统监控。
性能优化
性能优化可以从以下几个方面入手:
- 负载均衡:通过Ribbon进行负载均衡,可以将服务请求均匀地分配到不同的服务实例上,避免单一服务实例过载。
- 缓存:使用Redis或Memcached等缓存组件,减少数据库访问压力。
- 异步处理:使用Spring的异步处理机制,避免阻塞操作,提高系统响应速度。
- 服务降级:通过Hystrix进行服务降级,减少故障扩散,保证系统可用性。
系统监控
系统监控可以通过SpringBoot Actuator、Prometheus和Grafana等工具实现:
- SpringBoot Actuator:提供了丰富的端点(Endpoints),可以用来监控和管理应用的运行状态。
- Prometheus:一个开源的监控系统和时间序列数据库,可以采集、存储和查询监控数据。
- Grafana:一个开源的数据可视化工具,用于构建和操作复杂的监视仪表板。
配置Prometheus收集SpringBoot Actuator的监控数据:
在微服务的pom.xml
文件中添加Prometheus依赖:
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient</artifactId>
<version>0.10.0</version>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_springboot</artifactId>
<version>0.10.0</version>
</dependency>
在微服务的application.yml
文件中配置Prometheus:
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
spring:
actuator:
endpoints:
web:
exposure:
include: "*"
prometheus:
metrics:
enabled: true
安装并配置Prometheus和Grafana,构建监控仪表板,即可实现微服务的监控和管理。