SpringCloud之学习笔记(Feign+consul)

Posted 皓洲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud之学习笔记(Feign+consul)相关的知识,希望对你有一定的参考价值。

SpringCloud之学习笔记

Spring Cloud 为开发者提供了快速构建分布式系统中一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)。分布式系统的协调导致了样板模式,使用 Spring Cloud 开发人员可以快速建立实现这些模式的服务和应用程序。它们将适用于任何分布式环境,包括开发人员自己的笔记本电脑、裸机数据中心和托管平台(如 Cloud Foundry)。

SpringCloud中文文档:https://www.springcloud.cc/

Feign+consul

Feign是一个声明式的Web服务客户端,能够在类接口上添加注释,成为一个REST API 客户端。简单来说就是用来调用其他服务的。

consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。

pom依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency><!-- consul 服务发现 -->
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        
        <dependency><!-- consul 服务调用 -->
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        
        <dependency><!--springboot监控系统健康情况,可以预编译配置-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        
        <dependency><!--lombok-->
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

要注意Springboot和SpringCloud版本对应!!!

配置文件application.yml

客户端:

server:
  port: 8080

spring:
  application:
    name: feign-first-server
  cloud:
    ## 服务注册中心配置
    consul:
      host: 192.168.51.209 #consul的ip地址
      port: 8500 #consul开启的端口号
      enabled: true #开启注册
      discovery:
        register: true
        enabled: true #开启被发现
        serviceName: ${spring.application.name}
        prefer-ip-address: true
        instanceId: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
        port: ${server.port}
        healthCheckInterval: 10s

feign:
  hystrix:
    enabled: true # 开启hystrix熔断
  client:
    config:
      default:
        connectTimeout: 3000
        readTimeout: 32000

服务端:和客户端只有端口号和服务名不同

server:
  port: 8082

spring:
  application:
    name: feign-second-server
  cloud:
    ## 服务注册中心配置
    consul:
      host: 192.168.51.209 #consul的ip地址
      port: 8500 #consul开启的端口号
      enabled: true #开启注册
      discovery:
        register: true
        enabled: true #开启被发现
        serviceName: ${spring.application.name}
        prefer-ip-address: true
        instanceId: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
        port: ${server.port}
        healthCheckInterval: 10s

feign:
  hystrix:
    enabled: true # 开启hystrix熔断
  client:
    config:
      default:
        connectTimeout: 3000
        readTimeout: 32000

启动类注解:

@SpringBootApplication
@EnableFeignClients//启动Feign客户端
@EnableDiscoveryClient//启动consul
public class FeignDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(FeignDemoApplication.class, args);
    }
}

涉及到的Dto

@Data
@AllArgsConstructor
@NoArgsConstructor
public class FeignRequestDto {
    Integer id;
    String userName;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FeignResponseDto {
    Integer id;
    String message;
}

接口

@FeignClient(name = "feign-second-server", fallback = FeignInterface.DefaultFallback.class)
public interface FeignInterface {
    /**
     * 处理
     *
     * @param requestDTO 请求
     * @return 返回结果
     */

    @RequestMapping(value = "/feign2", method = {RequestMethod.POST})
    @ResponseBody
    FeignResponseDto processRequest(@RequestBody FeignRequestDto requestDTO);

    //重写一个默认备份
    @Component
    class DefaultFallback implements FeignInterface {
        @Override
        public FeignResponseDto processRequest(FeignRequestDto requestDTO) {
            FeignResponseDto responseDTO = new FeignResponseDto(requestDTO.getId(), "失败");
            return responseDTO;
        }
    }
}

客户端wrapper层

@Controller
@Slf4j
public class FeignWrapper {

    @Autowired
    private FeignInterface feignInterface;

    /** 处理
     * @param requestDTO  请求
     * @return            返回结果
     */
    @RequestMapping(value = "/feign", method = {RequestMethod.POST})
    @ResponseBody
    public FeignResponseDto processRequest(@RequestBody FeignRequestDto requestDTO) {
        log.info("我是first服务的开始请求second服务:{}", requestDTO.getUserName());
        return feignInterface.processRequest(requestDTO);
    }
}

服务端Service实现类

@Service
public class FeignWrapperImpl {
    /**
     * 请求处理
     *
     * @param requestDTO
     * @return
     */
    public FeignResponseDto doProcessRequest(FeignRequestDto requestDTO) {

        FeignResponseDto responseDTO = new FeignResponseDto();
        responseDTO.setMessage("用户名为:" + requestDTO.getUserName());
        responseDTO.setId(1000 + requestDTO.getId());

        // 返回
        return responseDTO;
    }
}

启动consul

下载consul:https://www.consul.io/downloads

启动consul:

consul agent -dev -client 192.168.51.209 -ui

流程图

结果展示

以上是关于SpringCloud之学习笔记(Feign+consul)的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud学习笔记-p3(Feign远程调用)

SpringCloud学习系列之二 ----- 服务消费者(Feign)和负载均衡(Ribbon)

Java 微服务之 SpringCloud快速入门day02 Feign

Java 微服务之 SpringCloud快速入门day02 Feign

SpringCloud学习笔记

springcloud费话之Eureka接口调用(feign)