SpringCloud Study - (八) Ribbon & Feign

Ribbon 和Fegin 都是客户端的负载均衡工具,经过简单的配置就能达到负载均衡。

目标: 

1.创建服务消费者模块,加入Ribbon的相关支持,尝试调用服务消费者。

2.尝试Ribbon的负责均衡策略

3.创建服务消费者模块,加入Feign的相关支持,尝试调用服务消费者。

步骤: 

1.1 创建Springboot消费者模块SpringbootConsumerRibbon,在pom 加入Ribbon 的支持。

 

<?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.example</groupId>
    <artifactId>SpringbootConsumerRibbon</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!-- 加入Rebbion的支持-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>

        <!--hystrix 支持 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>


    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

1.2 配置获取远程服务对象RestTemplate 对象,并在对象上面配置负责均衡注解。

@Configuration
public class BeanConfig {
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

1.3 编写测试Controller ,在controller 中加入RestTemplate 对象,用对象尝试调用服务提供者。

@RestController
public class HelloController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/testRebbion")
    public String sayHello(){
      // String message = restTemplate.getForEntity("http://localhost:8001/providerHello",String.class).getBody();
        String message = restTemplate.getForEntity("http://provider/providerHello",String.class).getBody();
        return "From Consumer , "+message;
    }
}

1.4 启动测试,在测试前本例已经启动了两个provider 和Eureka .

URL : http://localhost:7002/testRebbion

刷新 :

发现两个服务提供者会轮询访问.

1.5 配置随机负载均衡策略, 默认的是轮询负载均衡策略。

@Configuration
public class BeanConfig {
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Bean
    public IRule myRule() {
        // 随机策略
        return new RandomRule();
    }
}

1.6  重启模块测试,发现 访问provider1 和provider2 是随机的。

1.7 其他负责均衡策略说明:

RoundRibbonRule:轮询策略
RandomRule:随机策略
AvailabilityFilteringRule:可用的服务使用轮询策略,会抛弃不可用的服务。
WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应越快的服务权重越高,越容易被选中。一开始启动时,统计信息不足的情况下,使用轮询。
RetryRule:如果服务获取失败,就尝试重新尝试获取
BestAvailableRule:最优服务选择策略,会抛弃不可用服务
ZoneAvoidanceRule:区域和可用策略

2.1 创建Feign的springboot 模块 SpringbootConsumerFeign ,并在pom 中加入Feign 的支持。

<?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.example</groupId>
    <artifactId>SpringbootConsumerFeign</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!-- 加入Feign的支持-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--hystrix 支持 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.2 启动类中加入Feign 支持的注解.

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class ApplicationConsumerFeign {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationConsumerFeign.class,args);
    }
}

2.3 创建服务调用service 接口,并在service 上加上Feign 客户端注解,在接口方法中添加调用远程服务的注解。

@FeignClient( value = "provider")
public interface SayService {
    @GetMapping("/providerHello")
    public String providerHello();
}

2.4 写一个测试controller ,并在controller 注入service 接口。

@RestController
public class TestController {

    @Autowired
    SayService sayService;
    @RequestMapping("/testFeign")
    public String sayHello(){
     //   String message = restTemplate.getForEntity("http://provider/providerHello",String.class).getBody();
       String response =  sayService.providerHello();
        return "From Consumer , " +response;
    }
}

2.5 启动测试,刷新浏览器默认是轮询访问provider1 和provider2.

URL:  http://localhost:7003/testFeign

2.6 配置Feign 的路由策略,在本例用把路由策略配置成随机访问。修改Application.properties 文件,加入配置。

server.port=7003
spring.application.name=consumer_feign
eureka.client.serviceUrl.defaultZone=http://eureka1:9001/eureka

#指定Feign的路由策略
provider.ribbon.NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule

2.7 重新启动测试,刷新浏览器发现provider1和provider2 提供服务时随机的。

URL : http://localhost:7003/testFeign

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值