SpringCloud無廢話入門03:Feign聲明式服務調用

1.Feign概述java

        在上一篇的HelloService這個類中,咱們有這樣一行代碼:web

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

        對於代碼有必定潔癖的你來講,必定感受到了,這個url應該是能夠被配置的。既然說到配置,那咱們首先想到的就是使用java註解的方式。Feign就是這樣一個註解框架,它也是netflix爲咱們提供的,方便咱們整合ribbon和hystrix(後面會學習)。apache

        使用Feign,咱們能很方便的經過編寫接口並插入註解,來定義和代理HTTP請求。Feign主要具有以下特性:app

        支持Feign註解; 負載均衡

        支持Ribbon負載均衡;框架

        支持HTTP編碼器和解碼器;maven

        提供了熔斷器Hystrix;分佈式

2.Feign引入ide

        讓咱們修改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。這也是分佈式系統容錯能力更強的一種保證!

        感謝關注「碼農星球」。本文版權屬於「碼農星球」。咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系咱們。

相關文章
相關標籤/搜索