【springCloud搭建】四、集成ribbon+hystrix+feign

上篇文章传送门:【springCloud搭建】三、集成springCloudGateway网关

 ribbon+hystrix+feign所需的第三方包

        <!--feign服务通讯组件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--ribbon负载均衡组件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-ribbon</artifactId>
        </dependency>
        <!--hystrix熔断服务降级组件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-hystrix</artifactId>
        </dependency>

添加到gateway模块,service下的服务子模块的配置内

#Feign 配置
feign:
  #开启feign熔断器功能
  hystrix:
    enabled: true
  httpclient:
    # 开启 Http Client
    enabled: true
    # 最大连接数,默认:200
    max-connections: 200
    # 最大路由,默认:50
    max-connections-per-route: 50
    # 连接超时,默认:2000/毫秒
    connection-timeout: 2000
    # 生存时间,默认:900L
    time-to-live: 900
hystrix:
  shareSecurityContext: true
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000
  threadpool:
    default:
      coreSize: 100
#配置负载均衡
ribbon:
  eager-load:
    enabled: true
    #指定服务饿加载
    #clients:
    #  - service-one
  # 请求处理的超时时间
  ReadTimeout: 5000
  # 请求连接的超时时间
  ConnectTimeout: 2000
  # 对当前实例的重试次数
  maxAutoRetries: 1
  # 切换实例的重试次数(根据自己单个服务实例数配置)
  maxAutoRetriesNextServer: 3
  # 对所有操作请求都进行重试
  okToRetryOnAllOperations: true
  # 对Http响应码进行重试
  retryableStatusCodes: 500,404,502

feign

服务提供者service_one,服务消费者service_two

服务提供者service_one创建api接口类

package org.wcy.api;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.wcy.serviceOne.TestDTO;

/**
 * <p>Title : TestApiController.java</p>
 * <p>Description : 服务间调用的测试controller层</p>
 * <p>DevelopTools : IntelliJ IDEA 2018.2.3 x64</p>
 * <p>DevelopSystem : Windows 10</p>
 * <p>Company : org.wcy</p>
 * @author : WangChenYang
 * @date : 2021/5/15 16:09
 * @version : 0.0.1
 */
@RestController
@RequestMapping("test")
public class TestApiController {

    /**
     * 获取服务名字
     * @author 王晨阳
     * @date 2021/5/16-17:53
     * @version 0.0.1
    */
    @PostMapping("getName")
    public String getServiceName() {
        return "service_one";
    }

}

在服务消费者service_two启动类上加上feign组件发现注解 ,org.wcy.api为service_one_api模块的外放接口包路径

@EnableFeignClients("org.wcy.api")

 

在service_one服务接口外放模块内创建刚刚写好的接口并加上@FeignClient注解表明他是一个feign服务接口

注意:feignClient的服务名无法识别_所以在yml文件内的服务名必须也是不带_的可以改成 -,否则启动就会报 Service id not legal hostname (xxx)

因为在配置内开启了feign的hystrix熔断功能所以必须要配置fallback类,否则服务调用时就会报 failed and no fallback available

 

package org.wcy.api;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.wcy.fallback.TestServiceFallback;
import org.wcy.serviceOne.TestDTO;

/**
 * <p>Title : TestApi.java</p>
 * <p>Description : TestApi接口服务类</p>
 * <p>DevelopTools : IntelliJ IDEA 2018.2.3 x64</p>
 * <p>DevelopSystem : Windows 10</p>
 * <p>Company : org.wcy</p>
 * @author : WangChenYang
 * @date : 2021/5/16 18:06
 * @version : 0.0.1
 */
/*name为服务名,path为controller上加的前置路径,fallback熔断回调类*/
@FeignClient(name = "service-one", path = "/test", fallback = TestServiceFallback.class)
public interface TestApi {

    /**
     * 获取服务名字
     * @author 王晨阳
     * @date 2021/5/16-17:53
     * @version 0.0.1
     */
    @RequestMapping(value = "getName", method = RequestMethod.POST)
    String getServiceName();


}
package org.wcy.fallback;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import feign.hystrix.FallbackFactory;
import org.wcy.api.TestApi;
import org.wcy.serviceOne.TestDTO;

/**
 * <p>Title : TestServiceFallback.java</p>
 * <p>Description : TestApi熔断回调</p>
 * <p>DevelopTools : IntelliJ IDEA 2018.2.3 x64</p>
 * <p>DevelopSystem : Windows 10</p>
 * <p>Company : org.wcy</p>
 * @author : WangChenYang
 * @date : 2021/5/16 19:43
 * @version : 0.0.1
 */
@Component
public class TestServiceFallback implements TestApi {

    private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceFallback.class);

    public static final String ERR_MSG = "Test接口暂时不可用: ";

    @Override
    public String getServiceName() {
        return TestServiceFallback.ERR_MSG;
    }
}

引入service_one服务接口外放模块 service_one_api到服务消费者service_two的pom内

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.wcy</groupId>
    <artifactId>service_two</artifactId>
    <version>1.0.0</version>

    <parent>
        <groupId>org.wcy</groupId>
        <artifactId>service</artifactId>
        <version>1.0.0</version>
    </parent>

    <name>service_two</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <service_one.version>1.0.0</service_one.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.wcy</groupId>
            <artifactId>service_one_api</artifactId>
            <version>${service_one.version}</version>
        </dependency>
    </dependencies>
</project>

然后编写service_two外放给前端的接口,可以通过 @Autowired 注解直接注入其他服务的接口,像调用一个普通的service类那么简单

 

package org.wcy.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.wcy.api.TestApi;

/**
 * <p>Title : TestController.java</p>
 * <p>Description : 测试的controller层</p>
 * <p>DevelopTools : IntelliJ IDEA 2018.2.3 x64</p>
 * <p>DevelopSystem : Windows 10</p>
 * <p>Company : org.wcy</p>
 * @author : WangChenYang
 * @date : 2021/5/15 16:08
 * @version : 0.0.1
 */
@RestController
@RequestMapping("test")
public class TestController {

    @Autowired
    private TestApi testApi;

    /** 
     * 获取服务一的名称
     * @author 王晨阳
     * @date 2021/5/16-18:26
     * @version 0.0.1
    */
    @GetMapping("getServiceOne")
    public String getServiceOne() {
        //调用服务一
        return testApi.getServiceName();
    }

}

接下来是启动service_one服务,service_two服务,gateway网关服务,nacos注册中心进行feign服务调用的测试!

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值