配置步骤:配备环境:
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
<relativePath />
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.SR3</spring-cloud.version>
一、hystrix (feign)
1、配置pom文件:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
注意这里feign所在服务必须要在eureka注册,才能监控断网生效
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
主要需要这些配置,具体更具需要再做配置添加;
2、application.yml 文件配置
feign:
hystrix:
enabled: true
eureka:
client:
serviceUrl:
defaultZone: http://localhost:xxxx/eureka/
server:
port: xxxx
context-path: /
spring:
application:
name: hystrix-feign-server
主要需要这些配置,具体更具需要再做配置添加;
3、java文件:
启动类:
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
public class HystrixFeignServerApp {
public static void main(String[] args) {
SpringApplication.run(ZipkinGetAwayServerApp.class, args);
}
}
//feign接口:
@FeignClient(value="hystrix-feign-server",fallback=HiHystrix.class)
public interface UserApi {
@GetMapping("/hi")
public String hi();
}
//断网处理类:
@Component
public class HiHystrix implements UserApi{
@Override
public String hi() {
return "sorry Error!";
}
}
//访问层
@RestController
public class FeignControll {
@Autowired
private UserApi userApi;
@GetMapping("/hi")
public String sayHi() {
return userApi.sayHi();
}
}
二、hystrix(ribbon)
1、配置pom文件:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
2、application.yml 文件配置
server:
port: xxxx
context-path: /
spring:
application:
name: hystrix-ribbon-server
这里可以不用配置eurek
3、java文件:
启动类:
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
public class ZipkinGetAwayServerApp {
public static void main(String[] args) {
SpringApplication.run(ZipkinGetAwayServerApp.class, args);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
//访问层
@RestController
public class RibbonControll {
@Autowired
RestTemplate resttemplate;
@HystrixCommand(fallbackMethod="hiError")
@GetMapping("/sayHi")
public String sayHi() {
return resttemplate.getForObject("http://localhost:xxxx/hi", String.class);
}
//断网处理方法
public String hiError() {
return "HI_ERROR";
}
}
UserServer服务
//访问层
@RestController
public class UserControll {
@GetMapping("/hi")
public String sayHi() {
return "Hi Joy!";
}
}
上述例子均没问题,这个是在平时架构过程中遇到的问题:
The web application [ROOT] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:43)
遇到这个问题时确实很无奈,几乎被折腾的没脾气了,还好坚持发现解决了;具体什么原因呢?往控制台异常提示上面看:
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'shopGoodsController': Unsatisfied dependency expressed through field 'shopGoodsApi'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.hhzx.cloud.api.ShopGoodsApi': FactoryBean threw exception on object creation; nested exception is java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
如果遇到同样的问题,恭喜你,可以帮到你了:
去看看feign的调用方中api接口对应方法中的参数注解是否为:
@RequestParam
赶紧改成:@RequestBody 就ok了,主要是调整参数注解,将这两种参数注解尝试替换就行;
个人总结:
feign和ribbon我们都知道是可以处理负载均衡机制,而且feign本身包含了ribbon,属于声明式http协议请求,因此一般都用feign,但是在一定条件下推荐用ribbon,比如说,服务A、B,A在启动时就请求B,但B此时还没启动,因此在A启动时就报错,因为A使用的是feign调用B,但此时B未启动,由于我用的是A的调用层实现了接口
继承ApplicationRunner接口,并且需要实现run方法,还有一种方式是
@PostConstruct注解在需要启动是调用B服务上面的方法,
因此,以上两种方式,均要保证方法不能跑出异常,如果有,则服务启动不了
为了,服务间的独立、健壮,使用ribbon,它可以独立启动不需要注册eureka上面单独启动项目,远程调用对应的服务,当被调用方断网或者是不能被正常调用时,则启动异常处理机制(熔断机制)
==============需要请求支援问题:(希望看到的大牛可以解惑,谢谢!)===============
http协议,或者说是spingcloud 有没有一种机制可以判断:
1、请求时判断网络异常(上面的博客方案可以解决)
2、不用定时器,实现网络正常时的监控(可以用eureka监听事件解决,但该功能服务不需要注册到eureka上)
3、满足以上两个条件,且不需要在eureka上面注册,且不需要定时器完成此任务