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>

更改核心配置

  1. 修改文件后缀为yml

  2. 添加配置信息

    # 端口号
    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.