1.版本描述
- spring-boot:2.1.9.RELEASE
- spring-cloud: Greenwich.SR3
2.示例结构
结构图.png3.代码
3.1eureka注册中心
- 主要依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 启动类
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
- application.properties
spring.application.name=eureka-server
server.port=8761
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.server.enable-self-preservation=false
访问http://localhost:8761/
启动eureka注册中心
3.2服务提供端(一共有两个)
3.2.1 第一个
- 主要依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
- 启动类
@EnableEurekaClient
@SpringBootApplication
public class ScProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ScProviderApplication.class, args);
}
}
- 接口层
@Slf4j
@RestController
public class MultiplyController {
@Value("${spring.application.name}")
private String name;
@Value("${server.port}")
private String port;
@RequestMapping(value = "/multi",method = RequestMethod.GET)
public Integer multiply(@RequestParam("a") int a,@RequestParam("b") int b){
log.info("{}服务-端口:{}的multiply方法被调用---"+ LocalDateTime.now(),name,port);
return a*b;
}
}
- application.properties
spring.application.name=service-multiply
server.port=7777
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
3.2.2 第二个
- 主要依赖
与第一个相同 - 启动类
与第一个相同 - 接口层
与第一个相同 - application.properties
spring.application.name=service-multiply
server.port=7778
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
启动两个服务端
3.3服务消费端
- 主要依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
- 启动类
@EnableFeignClients
@SpringCloudApplication
public class ScFeignApplication {
public static void main(String[] args) {
SpringApplication.run(ScFeignApplication.class, args);
}
}
- 接口层
@Slf4j
@RestController
public class MultiplyController {
@Autowired
private GetMultiply getMultiply;
@Autowired
private ServiceInstance serviceInstance;
@RequestMapping(value = "/multi",method = RequestMethod.GET)
public Integer multiply(){
log.info("{}服务-端口:{}的multiply方法被调用---"+ LocalTime.now(),serviceInstance.getServiceId(),serviceInstance.getPort());
return getMultiply.multiply(1,2);
}
}
- GetMultiply 类
@FeignClient(value = "service-multiply",fallback = GetMultiplyImpl.class)
public interface GetMultiply {
@RequestMapping(value = "/multi",method = RequestMethod.GET)
Integer multiply(@RequestParam("a") int a, @RequestParam("b") int b);
}
- GetMultiplyImpl类
@Slf4j
@Component
public class GetMultiplyImpl implements GetMultiply {
@Autowired
private ServiceInstance serviceInstance;
@Override
public Integer multiply(int a, int b) {
log.error("{}服务-端口:{}调用报错!!",serviceInstance.getServiceId(),serviceInstance.getPort());
return 0;
}
}
- application.properties
spring.application.name=feign
server.port=8887
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
feign.hystrix.enabled=true
management.endpoints.enabled-by-default=true
management.endpoints.web.exposure.include=*
启动消费端
3.4Hystrix-dashboard
- 主要依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 启动类
@EnableEurekaClient
@EnableHystrixDashboard
@SpringBootApplication
public class SpringCloudDashboardApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudDashboardApplication.class, args);
}
}
- application.properties
spring.application.name=hystrix-dashboard
server.port=9999
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
eureka.client.service-url..defaultZone=http://localhost:8761/eureka/
启动hystrix-dashboard
,访问http://localhost:9999/hystrix
将进入监控面板主页面,页面如下:
在监控地址中输入http://localhost:8887/actuator/hystrix.stream
-
Dalay
:延迟时间 -
Title
: 显示的标题
点击Monitor Stream
,进入页面如下:
bashboard监控页面.png
如果页面展示的是loading...
,那么需要先访问一下服务消费端的接口,此demo的是http://localhost:8887/multi
,然后监控页面就会显示正常
对于页面各部分代表的含义,可以参考管网wiki,部分截图如下:
4.本demo中可能出现的bug
描述:Unable to connect to Command Metric Stream.
问题所在:
没有给监控的服务添加如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
然后启动类如下:
@EnableFeignClients
@SpringCloudApplication
public class ScFeignApplication {
public static void main(String[] args) {
SpringApplication.run(ScFeignApplication.class, args);
}
}
启动类中的
@EnableFeignClients
不是必要的,根据自己的需要决定,此demo中用了两个服务生产者,所以使用了feign
,重点是要有开启断路器的注解@EnableCircuitBreaker
,@SpringCloudApplication
注解的源代码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}
同时要注意application.properties
文件是有有开启断路器的配置
feign.hystrix.enabled=true
现在hystrix-dashboard
基本都是和turbine
一起使用的,毕竟hystrix-dashboard
只能监控单体应用,而turbine
可以监控多个,有兴趣的话可以参考spring cloud 聚合监控Turbine这篇文章,这篇文章也是建立在本文的基础之上的。
5.代码地址
eureka:https://gitee.com/xiongzelin/eureka-seever.git
服务提供端:
网友评论