2 Eureka和Feign和Hystix
创建SpringCloud的多模块项目
创建dubbo式的空项目
- 无需任何依赖,
- 删除除了pom.xml以上的所有文件
- 删除pom.xml中的原有dependency和build
加入版本管理,加入依赖,加入打包方式,加入模块管理(模块管理可不加)
<springcloud.version>Dalston.SR4</springcloud.version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${springcloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<packaging>pom</packaging>
<modules>
<module>eureka-server</module>
<module>edoc-provider</module>
<module>edoc-cosumer</module>
...
</modules>
创建eureka-server模块
- 必须有spring-web依赖
- 相同包名
- 模块名eureka-server
- 加上@EnableEurekaServer注解
- 修改parent标签
加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<parent>
...
<relativePath>../pom.xml</relativePath>
</parent>
更改核心配置
-
修改文件后缀为yml
-
添加配置信息
# 端口号 server: port: 8089 # 服务名(应用名),会在eureka注册中心显示 spring: application: name: eureka-server # eureka注册中心配置 eureka: client: register-with-eureka: false # 是否注册自己的信息到eureka注册中心,默认是true fetch-registry: false # 是否需要拉去其它服务的信息,默认是true service-url: defaultZone: http://127.0.0.1:${server.port}/eureka
创建edoc-provider提供者模块
- 必须有spring-web依赖
- 相同包名
- 模块名edoc-provider
- 加上@EnableEurekaClient注解
- 加上@EnableFeignClients方便消费者调用
- 修改parent标签
加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
更改核心配置
# 端口号
server:
port: 8091
# 服务名(应用名),会在eureka注册中心显示
spring:
application:
name: edoc-cosumer
# eureka配置
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8089/eureka
# 开启hystrix断路器,这个没有提示,但是不影响使用
feign:
hystrix:
enabled: true
业务操作
controller + service + impl + mapper
@RestController
@RequestMapping("/edoc")
public class EdocController {
@Autowired
private EdocService edocService;
/**
* @author : Lcywings
* @date : 2021/8/27 10:03
* @acl : true
* @description : 根据文档id查询文档详情
*/
@GetMapping("/edocInfo")
public EdocEntry edocInfo(@RequestParam Integer id) {
return edocService.queryEdocEntryById(id);
}
/**
* @author : Lcywings
* @date : 2021/8/27 10:58
* @acl : true
* @description :测试feign服务调用
*/
@GetMapping("/testFeign")
public String testFeign() {
return "edoc-provider return Hello Feign";
}
}
public interface EdocService {
/**
* @author : Lcywings
* @date : 2021/8/27 10:05
* @acl : true
* @description : 根据文档id查询文档详情
*/
EdocEntry queryEdocEntryById(Integer id);
}
@Service
public class EdocServiceImpl implements EdocService {
@Autowired(required = false)
private EdocMapper edocMapper;
@Override
public EdocEntry queryEdocEntryById(Integer id) {
// 调用mapper接口,查询数据
return edocMapper.selectEdocEntryById(id);
}
}
@Mapper
public interface EdocMapper {
/**
* @author : Lcywings
* @date : 2021/8/27 10:07
* @acl : true
* @description : 根据文档编号查询文档详情
*/
@Select("select * from edoc_entry where id = #{id}")
EdocEntry selectEdocEntryById(Integer id);
}
创建edoc-cosumer提供者模块
- 必须有spring-web依赖
- 相同包名
- 模块名edoc-cosumer
- 加上@EnableEurekaClient注解
- 加上@EnableFeignClients注解
加入依赖,修改parent标签
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
更改核心配置
# 端口号
server:
port: 8091
# 服务名(应用名),会在eureka注册中心显示
spring:
application:
name: edoc-cosumer
# eureka配置
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8089/eureka
# 开启hystrix断路器,这个没有提示,但是不影响使用
feign:
hystrix:
enabled: true
业务操作
controller + service
@RestController
@RequestMapping("/edoc")
public class EdocFeignController {
@Autowired(required = false)
private EdocFeignService edocFeignService;
/**
* @author : Lcywings
* @date : 2021/8/27 11:02
* @acl : true
* @description : 测试在消费端使用Feign调用远程的服务接口
*/
@GetMapping("/helloFeign")
public String helloFeign() {
// 调用服务端接口,实现调用
return edocFeignService.invokeProviderTestFeign();
}
/**
* @author : Lcywings
* @date : 2021/8/27 11:38
* @acl : true
* @description : feignEdocInfoByIds
*/
@GetMapping("/feignEdocInfos")
public List<EdocEntry> feignEdocInfos(Integer... ids) {
// 调用服务端接口,实现调用
List<EdocEntry> edocEntries = new ArrayList<>();
String s = "";
for (int i = 0; i < ids.length; i++) {
edocEntries.add(edocFeignService.feignEdocInfos(ids[i]));
}
return edocEntries;
}
}
@FeignClient(name = "edoc-provider", fallback = EdocFeignServiceImpl.class)
public interface EdocFeignService {
/**
* @author : Lcywings
* @date : 2021/8/27 11:04
* @acl : true
* @description : 使用feign调用edoc-proider提供的接口
*/
@GetMapping("/edoc/testFeign")
String invokeProviderTestFeign();
/**
* @author : Lcywings
* @date : 2021/8/27 11:39
* @acl : true
* @description : 复用服务端controller
*/
@GetMapping("/edoc/edocInfo")
EdocEntry feignEdocInfos(@RequestParam("id") Integer id);
}
@Component
public class EdocFeignServiceImpl implements EdocFeignService {
@Override
public String invokeProviderTestFeign() {
return "invoke Provider testFegin Trigger Hystrix";
}
@Override
public EdocEntry feignEdocInfos(Integer id) {
return null;
}
}
Q.E.D.