1、这里只演示缓存,就用一个项目测试,创建一个hystrix-ribbon-cache-consumer的maven项目
pom.xml
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</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-eureka-client</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<!-- 因为Hystrix本身缓存不支持集群的,无法做到消息同步,但是sprinboot集成了cache(redis)-->
<!-- 然而Hystrix是支持spring无缝对接的,所以这里需要通过spring的cache插件达到Hystrix分布式下缓存同步的效果-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
application.yml
spring:
application:
name: hystrix-ribbon-cache-consumer
redis:
host: 192.168.214.129 #redis服务器地址
port: 6379 #redis服务端口
password: bugaosuni #redis服务密码
timeout: 5000 #连接超时时间(豪秒)
database: 0 #redis数据库索引,默认为0,也就是第一个库
jedis:
pool:
min-idle: 50 #连接最小空闲连接数
max-idle: 200 #最大空闲连接数
max-wait: 3000 #连接池最大阻塞等待时间,负值 表示没有限制
max-active: 100 #连接池最大连接数,负值 表示没有限制
server:
port: 8082
eureka:
client:
serviceUrl:
defaultZone: http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/
instance:
prefer-ip-address: true #默认是hostname注册,改成IP注册
2、新增服务类,在这个类里配置缓存,因为这里主要是测试缓存,所以去掉了Hystrix,但@Cacheable可以和@HystrixCommand一起用在方法上,这样就到达目的了。
//配置cache的前缀,redis保存数据是以键值对的形式存储 eg:com.ym.zhangsan
@CacheConfig(cacheNames={"com.ym."})
@Service
public class StudentService {
/**
* 新增缓存
* @param name
* @return
*/
@Cacheable(key="'student' + #name")
public Student get(String name) {
System.out.println("--------get(获取数据,看到这条数据说明没有进缓存)---------");
return new Student(name,10);
}
/**
* 删除缓存
* @param name
*/
@CacheEvict(key="'student' + #name")
public void del(String name) {
System.out.println("--------del(缓存)---------");
}
}
3、提供一个rest类测试
@RestController
public class StudentController {
@Autowired
private StudentService studentService;
@GetMapping("get")
public Student get(String name) {
return studentService.get(name);
}
@GetMapping("del")
public void del(String name) {
studentService.del(name);
}
}