【Spring Cloud 系列】三、服务消费者(Feign)(Hoxton.M3 版本)

举报
小阿杰· 发表于 2022/01/25 22:01:17 2022/01/25
【摘要】 环境:IDEAJDK1.8Spring Cloud Hoxton.M3Spring Boot 2.2.0 一、Feign简介  Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息,而Feign则会完全代理HTTP请求,我们只需...

环境:

IDEA
JDK1.8
Spring Cloud Hoxton.M3
Spring Boot 2.2.0

一、Feign简介

  Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息,而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon和Hystrix。

  总起来说,Feign具有如下特性:

  1. 可插拔的注解支持,包括Feign注解和JAX-RS注解;
  2. 支持可插拔的HTTP编码器和解码器;
  3. 支持Hystrix和它的Fallback;
  4. 支持Ribbon的负载均衡;
  5. 支持HTTP请求和响应的压缩。

FeignClient注解的一些属性

  • value:默认值为空字符串,主要作用调用服务名称,和name属性相同
  • serviceId:默认值为空字符串,主要作用服务id,作用和name属性相同
  • name:默认值为空字符串,主要作用调用服务名称,和value属性相同
  • url:默认值为空字符串,主要作用全路径地址或hostname,Http或Https可选
  • decode404:默认值为false,主要作用配置响应状态码为404时是否应该抛出FeignExceptions
  • configuration:默认值为{},主要作用自定义当前feign client的一些配置
  • fallback:默认值为void.class,主要作用熔断机制,调用失败时,回退方法,可以用来抛出异常或给出默认返回数据。
  • path:默认值为空字符串,主要作用自动给所有方法的requestMapping前加上前缀,类似与controller类上的requestMapping

二、创建项目

1、File ----- New -----Project

1.jpg

2、Spring Initializr ----- Next

2.jpg

3、输入 Group 和 Artifact,点击 Next

3.png

4、选择Spring cloud Discovery -----Eureka Discovery Client---- Next

4.jpg

5、创建完成 点击 Finish 则在新窗口打开新建的工程

5.jpg

6.jpg

三、完善项目

1、由于刚刚创建的文件是初始化默认的项目,需要添加相应注解和配置文件。具体详情如下:


a.Eureka的依赖spring-cloud-starter-eureka
<!-- spring-cloud-starter-eureka -->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
b.Feign的依赖spring-cloud-starter-feign
<!-- spring-cloud-starter-feign -->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
c.Web的依赖spring-boot-starter-web
<!-- spring-boot-starter-web -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2、ClientserverApplication.java添加注解@EnableEurekaClient

7.jpg

3、完善配置文件application.properties 需要制定应用名称,应用名称为:Client_Server1


#服务的端口
server.port=8762
#注册到服务中心的地址
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
#是否注册到eureka服务器,
eureka.client.registerWithEureka=true 
#是否从eureka服务器获取注册信息
eureka.client.fetchRegistry=true
#是否开启自我保护模式,默认为true。
eureka.server.enable-self-preservation=true
#续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
eureka.server.eviction-interval-timer-in-ms=10000
spring.application.name=Client-Server1

4、创建ClientController


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * Created by 公众号:Java全栈架构师
 */
@RestController
public class ClientController {
    @RequestMapping("/test")
    //    @ResponseBody
    public String test(@RequestParam String  name){
        return  "Hello World!==port:8762==="+name;
    }

}

8.jpg

四、运行项目

1、进入FeignclientserverApplication.java 启动类,右击选择Run

9.jpg

2、进入服务注册中心:

http://localhost:8761/ 显示服务已经注册成功(显示两个服务,是由于把其中一个复制了一下,修改端口号:8763,两个Feign项目所以就显示两个。)

10.jpg

3、输入http://localhost:8762/test?name=123

返回数据如下:

11.jpg
Hello World!port:8762=123

4、最后上一张启动三个服务的图:

12.png

五、项目代码

1、pom.xml


    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>cn.mcus</groupId>
  <artifactId>feignclientserver1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>feignclientserver</name>
  <description>Demo project for Spring Boot</description>

  <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>Hoxton.M3</spring-cloud.version>
  </properties>

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

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <groupId>org.junit.vintage</groupId>
          <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <!-- spring-cloud-starter-eureka -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <!-- spring-cloud-starter-feign -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>
    <!-- spring-boot-starter-web -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</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>

  <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
    </repository>
  </repositories>

</project>

2、application.properties文件


server.port=8762
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
#是否注册到eureka服务器,
eureka.client.registerWithEureka=true 
#是否从eureka服务器获取注册信息
eureka.client.fetchRegistry=true
#是否开启自我保护模式,默认为true。
eureka.server.enable-self-preservation=true
#续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
eureka.server.eviction-interval-timer-in-ms=10000
spring.application.name=Client-Server1

3、ClientserverApplication.java


package cn.java;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * Created by 公众号:Java全栈架构师 
 */
@SpringBootApplication
@EnableEurekaClient
public class ClientserverApplication {

  public static void main(String[] args) {
    SpringApplication.run(ClientserverApplication.class, args);
  }

}

4、Controller


package cn.scpro.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by 公众号:Java全栈架构师 
 */
@RestController
public class ClientController {
    @RequestMapping("/test")
//    @ResponseBody
    public String test(@RequestParam String  name){

        return  "Hello World!==port:8762==="+name;
    }

}

结语

  好了,以上就是服务消费者(Feign)(Hoxton.M3 版本),感谢您的阅读,希望您喜欢,如对您有帮助,欢迎点赞收藏。如有不足之处,欢迎评论指正。下次见。
  作者介绍:【小阿杰】一个爱鼓捣的程序猿,JAVA开发者和爱好者。公众号【Java全栈架构师】欢迎关注阅读交流。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。