2019-12-25

SpringCloud分布式微服务b2b2c电子商务docker-feign配置(六)
这节我们讨论一下feign配置,通过编写配置类,我们可以自定义feign的日志级别,日志扫描目录,可以通过feign调用服务在eureka上的调用信息。

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

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

name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现了解springcloud架构可以加求求:三五三六二四七二五九
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)

项目结构如下:

2019-12-25_第1张图片
image.png

二、pom.xml文件

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">

microservice-spring-cloud
com.jacky
1.0-SNAPSHOT

4.0.0

microservice-consumer-movie-feign-customizing
jar


    UTF-8
    UTF-8
    1.8



    
        org.springframework.boot
        spring-boot-starter-web
    

    
        org.springframework.cloud
        spring-cloud-starter-eureka
    

    
        org.springframework.boot
        spring-boot-starter-actuator
    

    
        org.springframework.cloud
        spring-cloud-starter-feign
    



    
        
            com.spotify
            docker-maven-plugin
            
                
                
                    build-image
                    install
                    
                        build
                    
                
            
            
                
                http://192.168.6.130:5678
                true
                
                ${docker.repostory}/${docker.image.prefix}/${project.artifactId}:${project.version}
                
                java:openjdk-8-jdk-alpine
                
                ["java", "-jar", "/${project.build.finalName}.jar"]
                
                    
                        /
                        ${project.build.directory}
                        ${project.build.finalName}.jar
                    
                
            
        
    

三、配置文件
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配置类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);
}
}

你可能感兴趣的:(2019-12-25)