文档章节

Java springcloud B2B2C o2o多用户商城 springcloud架构-docker-feign配置(五)

s
 sccspuercode
发布于 01/23 08:48
字数 1235
阅读 21
收藏 1

简介

上一节我们讨论了怎么用feign声明式调用cloud的生产者,这节我们讨论一下feign配置,通过编写配置类,我们可以自定义feign的日志级别,日志扫描目录,可以通过feign调用服务在eureka上的调用信息。Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码请加企鹅求求:一零三八七七四六二六

feign声明接口之后,在代码中通过@Resource或者@Autowired注入之后即可使用。

@FeignClient标签的常用属性如下:

  • name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
  • url: url一般用于调试,可以手动指定@FeignClient调用的地址
  • decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
  • configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
  • fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
  • fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
  • path: 定义当前FeignClient的统一前缀

一、创建模块(microservice-consumer-movie-feign-customizing)

项目结构如下:

二、pom.xml

<?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">
    <parent>
        <artifactId>microservice-spring-cloud</artifactId>
        <groupId>com.jacky</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>microservice-consumer-movie-feign-customizing</artifactId>
    <packaging>jar</packaging>

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

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <executions>
                    <!--设置在执行maven 的install时构建镜像-->
                    <execution>
                        <id>build-image</id>
                        <phase>install</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!--安装了docker的主机,并且打开了api remote接口设置-->
                    <dockerHost>http://192.168.6.130:5678</dockerHost>
                    <pushImage>true</pushImage><!--设置上传镜像到私有仓库,需要docker设置指定私有仓库地址-->
                    <!--镜像名称-->
                    <imageName>${docker.repostory}/${docker.image.prefix}/${project.artifactId}:${project.version}</imageName>
                    <!--镜像的基础版本-->
                    <baseImage>java:openjdk-8-jdk-alpine</baseImage>
                    <!--镜像启动参数-->
                    <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

三、配置文件

spring:
  application:
    name: microservice-consumer-movie-feign-customizing
server:
  port: 7901
eureka:
  client:
    healthcheck:
      enabled: true
    serviceUrl:
      defaultZone: http://jacky:admin@peer1:8761/eureka/,http://jacky:admin@peer2:8762/eureka/,http://jacky:admin@peer3:8763/eureka/
  instance:
    prefer-ip-address: true
#feign日志配置
logging:
  level:
    com.jacky.cloud.feign.UserFeignClient: DEBUG

# 解决第一次请求报超时异常的方案:
# hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000  #延长超时时间
# 或者:
# hystrix.command.default.execution.timeout.enabled: false
# 或者:
feign.hystrix.enabled: false                       # 索性禁用feign的hystrix支持

# 超时的issue:https://github.com/spring-cloud/spring-cloud-netflix/issues/768
# 超时的解决方案: http://stackoverflow.com/questions/27375557/hystrix-command-fails-with-timed-out-and-no-fallback-available
# hystrix配置: https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.thread.timeoutInMilliseconds

四、实体类User.java

package com.jacky.cloud.entity;

import java.math.BigDecimal;

public class User {
  private Long id;

  private String username;

  private String name;

  private Short age;

  private BigDecimal balance;

  public Long getId() {
    return this.id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getUsername() {
    return this.username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Short getAge() {
    return this.age;
  }

  public void setAge(Short age) {
    this.age = age;
  }

  public BigDecimal getBalance() {
    return this.balance;
  }

  public void setBalance(BigDecimal balance) {
    this.balance = balance;
  }

}

五、feign客户端1(UserFeignClient1.java)

package com.jacky.cloud.feign;

import org.springframework.cloud.netflix.feign.FeignClient;

import com.jacky.cloud.entity.User;
import com.jacky.config.Configuration1;

import feign.Param;
import feign.RequestLine;

@FeignClient(name = "microservice-provider-user", configuration = Configuration1.class)
public interface UserFeignClient1 {
  @RequestLine("GET /simple/{id}")
  public User findById(@Param("id") Long id);
}

六、feign客户端2(UserFeignClient2.java)

package com.jacky.cloud.feign;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import com.jacky.config.Configuration2;

@FeignClient(name = "xxxx", url = "http://localhost:8761/", configuration = Configuration2.class)
public interface UserFeignClient2 {
  @RequestMapping(value = "/eureka/apps/{serviceName}")
  public String findServiceInfoFromEurekaByServiceName(@PathVariable("serviceName") String serviceName);
}

七、feign配置类1(Configuration1.java)

package com.jacky.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import feign.Contract;
import feign.Logger;

@Configuration
public class Configuration1 {
  @Bean
  public Contract feignContract() {
    return new feign.Contract.Default();
  }

  @Bean
  Logger.Level feignLoggerLevel() {
    return Logger.Level.FULL;  //定义feign日志显示级别
  }
}

八、feign配置类2(Configuration2.java)

package com.jacky.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import feign.auth.BasicAuthRequestInterceptor;

@Configuration
public class Configuration2 {
  @Bean
  public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
    return new BasicAuthRequestInterceptor("jacky", "admin"); //Eureka添加了安全验证,则需要配置上面的用户名、密码
  }
}

九、MovieController.java

package com.jacky.cloud.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import com.jacky.cloud.entity.User;
import com.jacky.cloud.feign.UserFeignClient2;
import com.jacky.cloud.feign.UserFeignClient1;

@RestController
public class MovieController {

  @Autowired
  private UserFeignClient1 userFeignClient1;

  @Autowired
  private UserFeignClient2 userfeignClient2;

  /**
   * 调用生产者服务
   * @param id
   * @return
     */
  @GetMapping("/movie/{id}")
  public User findById(@PathVariable Long id) {
    return this.userFeignClient1.findById(id);
  }

  /**
   * 获得服务在eureka信息
   * @param serviceName
   * @return
     */
  @GetMapping("/{serviceName}")
  public String findServiceInfoFromEurekaByServiceName(@PathVariable String serviceName) {
    return this.userfeignClient2.findServiceInfoFromEurekaByServiceName(serviceName);
  }
}

十、启动类ConsumerMovieFeignApplication.java

package com.jacky.cloud;

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

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

Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码请加企鹅求求:一零三八七七四六二六 

© 著作权归作者所有

共有 人打赏支持
s
粉丝 15
博文 90
码字总数 69422
作品 0
惠州
私信 提问
加载中

评论(1)

鸿
鸿鹄springcloud
经典哦
java B2B2C 源码 多级分销Springcloud多租户电子商城系统-Spring Cloud eureka

在构建项目之前,我们先学习一下eureka,这是官方的讲解,我这边再重新帮大家回顾一下:需要源码可以加企鹅球球:一零三八七七四六二六 来源: java B2B2C 源码 Springcloud多租户电子商城系...

park
01/15
0
0
Java B2B2C o2o多用户商城 springcloud架构:服务消费(Feign)

Spring Cloud Feign Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。我们只需要通过创建接口并用注解来配置它既可完成对Web...

park
01/21
0
0
Java B2B2C多用户商城 springboot架构-spring、springMvc、springBoot和springCloud的联系与区别

spring、springMvc、springBoot和springCloud的联系与区别 需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码请加企鹅求求 :二一四七七七五六三三 spring和springM...

it菲菲
2018/12/18
0
0
微服务Springcloud超详细教程+实战(四)

如在文档中遇到什么问题请联系作者 QQ:1172796094 本人正在找深圳Java实习工作,求大佬带飞 —————————————————————————————————————— 初始SpringClo...

Java小表弟
2018/12/11
0
0
史上最简单的 SpringCloud 教程 | 终章

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://blog.csdn.net/forezp。 https://blog.csdn.net/forezp/article/details/70148833 转载请标明出处...

方志朋
2017/04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【kafka】kafka集群搭建

简介 要配置kafka,首先要配置zookeeper保证集群的高可用。因此本教程包含两者的配置。 1、下载kafka:https://www.apache.org/dyn/closer.cgi?path=/kafka/2.1.0/kafka_2.11-2.1.0.tgz 2、下...

Areya
13分钟前
1
0
iOS图片拉伸之神属性:resizableImageWithCapInsets

在仿写QQ会话窗口的时候,气泡的背景图片拉伸问题。并不是所有地方都可以拉伸的,所以定义了下面的工具类中的一个方法,专门拉伸图片。 UIImageResizingModeStrech:拉伸模式,通过拉伸UIEdg...

壹峰
19分钟前
0
0
Syncfusion教程:在Xamarin.Forms中创建数据输入表单 (2)

下载Essential Studio for Xamarin最新版本 Essential Studio for Xamarin是全面的Xamarin.iOS、Xamarin.Android和Xamarin.Forms组件套包,包含最快的图表和网格。 如何将Syncfusion输入控件...

电池盒
32分钟前
0
0
Infor宣布首次公开募股

为特定行业提供商业云软件的全球领先提供商Infor今天宣布达成协议,获得科氏控股发展有限公司(KED , Koch Equity Development, LLC)以及金门资本(Golden Gate Capital)15亿美元投资。 继201...

linux-tao
44分钟前
1
0
Mysql索引总结

由于Mysql的索引是B-tree或B+tree,所以下面会先涉及到一些树的概念。 1、二叉树特性:左子树的键值小于根的键值,右子树的键值大于根的键值。 2、平衡二叉树是为了减小树的深度从而减小查找...

浮躁的码农
45分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部