• SpringCloud无废话入门03:Feign声明式服务调用


    1.Feign概述

            在上一篇的HelloService这个类中,我们有这样一行代码:

            return restTemplate.getForObject("http://hello-service/hello",String.class);

            对于代码有一定洁癖的你来说,一定感觉到了,这个url应该是可以被配置的。既然说到配置,那我们首先想到的就是使用java注解的方式。Feign就是这样一个注解框架,它也是netflix为我们提供的,方便我们整合ribbon和hystrix(后面会学习)。

            使用Feign,我们能很方便的通过编写接口并插入注解,来定义和代理HTTP请求。Feign主要具备如下特性:

            支持Feign注解; 

            支持Ribbon负载均衡;

            支持HTTP编码器和解码器;

            提供了熔断器Hystrix;

    2.Feign引入

            让我们修改ribbon这个项目,使之支持feign。

            首先,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/maven-v4_0_0.xsd">

        <parent>

            <artifactId>springcloud.parent</artifactId>

            <groupId>com.zuikc</groupId>

            <version>1.0-SNAPSHOT</version>

        </parent>

        <modelVersion>4.0.0</modelVersion>

        <packaging>war</packaging>

        <name>ribbon</name>

        <artifactId>ribbon</artifactId>

        <dependencyManagement>

            <dependencies>

                <dependency>

                    <groupId>org.springframework.cloud</groupId>

                    <artifactId>spring-cloud-dependencies</artifactId>

                    <version>Greenwich.RELEASE</version>

                    <type>pom</type>

                    <scope>import</scope>

                </dependency>

            </dependencies>

        </dependencyManagement>

        <dependencies>

            <dependency>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-starter</artifactId>

            </dependency>

            <dependency>

                <groupId>org.springframework.cloud</groupId>

                <artifactId>spring-cloud-starter-eureka</artifactId>

                <version>1.4.6.RELEASE</version>

            </dependency>

            <dependency>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-starter-test</artifactId>

                <scope>test</scope>

            </dependency>

            <dependency>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-starter-web</artifactId>

            </dependency>

            <dependency>

                <groupId>org.springframework.cloud</groupId>

                <artifactId>spring-cloud-starter-feign</artifactId>

                <version>1.4.6.RELEASE</version>

            </dependency>

        </dependencies>

    </project>

            注意pom中的粗体部分。引入Feign依赖,会自动引入Hystrix依赖。

            appcation.yml并不需要变动。

    3.@EnableFeignClients

            修改ServiceRibbonApplication,加入注解@EnableFeignClients,这一步很重要,说明项目对于feign的支持,

    package com.zuikc;

    import org.springframework.boot.SpringApplication;

    import org.springframework.boot.autoconfigure.SpringBootApplication;

    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

    import org.springframework.cloud.client.loadbalancer.LoadBalanced;

    import org.springframework.cloud.openfeign.EnableFeignClients;

    import org.springframework.context.annotation.Bean;

    import org.springframework.web.client.RestTemplate;

    /**

     * @ClassName ServiceRibbonApplication

     * @Description 我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系“码农星球”

     * @Author 码农星球

     **/

    @SpringBootApplication

    @EnableDiscoveryClient

    @EnableFeignClients

    public class ServiceRibbonApplication {

        public static void main(String[] args) {

            SpringApplication.run(ServiceRibbonApplication.class, args);

        }

        @Bean

        @LoadBalanced

        RestTemplate restTemplate() {

            return new RestTemplate();

        }

    }

    4.服务接口

            创建一个接口,

    package com.zuikc;

    import org.springframework.cloud.openfeign.FeignClient;

    import org.springframework.web.bind.annotation.RequestMapping;

    @FeignClient(value = "hello-service")

    public interface HelloService {

        //服务中方法的映射路径

        @RequestMapping("/hello")

        String hello();

    }

            这个接口就比较重要了。

            注解@FeignClient说明了,我们需要去eureka服务上去调用“hello-service”这个服务。

            注解@RequestMapping指的是我们需要调用的路径。

    5.控制器

            现在我们还需要最后一步,就是创建一个控制器来接受请求,然后让robbin去分发,

    package com.zuikc;

    import org.springframework.beans.factory.annotation.Autowired;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RestController;

    /**

     * @ClassName ConsumerController

     * @Description 我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系“码农星球”

     * @Author 码农星球

     **/

    @RestController

    public class HelloController {

        @Autowired

        HelloService helloService;

        @RequestMapping("/hello")

        public String helloConsumer(){

            return helloService.hello();

        }

    }

            当一切处理完成,让我们启动这个项目,我们仍旧看到ribbon的这个服务,

            然后,http://localhost:9291/hello吧,可以看到LB非常的成功。

            现在,假设其中一个服务提供者因为某种原因(比如异常、断网)停掉了,看看结果会是怎么样的。为了模拟这个现象,让我们关闭provider2,发现我们无论怎么刷新上面的url,LB永远分配到provider1。这也是分布式系统容错能力更强的一种保证!

            感谢关注“码农星球”。本文版权属于“码农星球”。我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系我们。

  • 相关阅读:
    关于JDK中的设计模式
    关于Java中的构造方法和set方法()给属性赋值
    关于Object[]数组强转成Integer[]类型的数组.
    [ImportNew]Java中的Timer类和TimerTask类
    关于Linux最基本总结
    关于数组
    关于Linux系统和Windows系统中文件夹的命名规范
    关于数组集合之间的转换
    关于Java获取系统信息
    关于Windows常用命令
  • 原文地址:https://www.cnblogs.com/luminji/p/10608573.html
Copyright © 2020-2023  润新知