Feign
RestTemplate
URL
Feignhttphttps://github.com/OpenFeign/feign
http
FeignRestTemplate
Fegin
1
order-servicepomfeign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2
order-serviceFeign
3Feign
order-service
package cn.itcast.order.client;
import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
SpringMVC
- userservice
- GET
- /user/{id}
- Long id
- User
FeignhttpRestTemplate
4
order-serviceOrderServicequeryOrderByIdFeignRestTemplate
5
Feign
@EnableFeignClients
FeignClient
FeignClientRestTemplate
2.2.
Feign
| feign.Logger.Level | NONEBASICHEADERSFULL | |
| feign.codec.Decoder | httpjsonjava | |
| feign.codec.Encoder | http | |
| feign. Contract | SpringMVC | |
| feign. Retryer | Ribbon |
@BeanBean
2.2.1.
feign
feign:
client:
config:
userservice: #
loggerLevel: FULL #
feign:
client:
config:
default: # default
loggerLevel: FULL #
- NONE
- BASICURL
- HEADERSBASIC
- FULL
2.2.2.Java
JavaLogger.Level
public class DefaultFeignConfiguration {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC; // BASIC
}
}
@EnableFeignClients
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class)
@FeignClient
@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class)
2.3.Feign
Feignhttp
URLConnection
Apache HttpClient
OKHttp
FeignURLConnection
ApacheHttpClient
1
order-servicepomApacheHttpClient
<!--httpClient -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2
order-serviceapplication.yml
feign:
client:
config:
default: # default
loggerLevel: BASIC # BASIC
httpclient:
enabled: true # feignHttpClient
max-connections: 200 #
max-connections-per-route: 50 #
FeignClientFactoryBeanloadBalance
Debugorder-serviceclientApache HttpClient
Feign
1.basic
2.HttpClientOKHttpURLConnection
feign-httpClient
httpClient
2.4.
Feigncontroller
feign
UserController
2.4.1.
1APISpringMVC
2FeignController
Controller
2.4.2.
FeignClientPOJOFeign
UserClientUserFeignfeign-api
2.4.3.
1
modulefeign-api
feign-apifeignstarter
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
order-serviceUserClientUserDefaultFeignConfigurationfeign-api
2order-servicefeign-api
order-serviceUserClientUserDefaultFeignConfiguration
order-servicepomfeign-api
<dependency>
<groupId>cn.itcast.demo</groupId>
<artifactId>feign-api</artifactId>
<version>1.0</version>
</dependency>
order-servicefeign-api
3
UserClientcn.itcast.feign.clients
order-service@EnableFeignClientscn.itcast.orderUserClient
4
Feign
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
Client
@EnableFeignClients(clients = {UserClient.class})
Feign
FeignSpring Securitytoken
@HeadersAuthorizationSpring Security
@FeignClient(name = "service-provider")
public interface UserFeignClient {
@RequestLine("GET /api/users/{id}")
@Headers("Authorization: {token}")
User getUserById(@Param("id") Long id, @Param("token") String token);
}OpenFeign
package feign;
/**
* .
* Targetapply(RequestTemplate)http
* Clientexecute(Request, feign.Request.Options)
*
* rest
* apply(RequestTemplate)/path/{foo}/barfoo
* RequestInterceptor.intercept()
*
*/
public interface RequestInterceptor {
/**
* RequestTemplate
*/
void apply(RequestTemplate template);
}RequestInterceptorapply
package com.example.rtbootconsumer.config.interceptor;
import com.example.rtbootconsumer.common.utils.TraceIdUtil;
import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Configuration;
/**
* @Description Feign
**/
@Configuration
public class FeignRequestInterceptor implements RequestInterceptor {
/**
* @description: traceId
*/
@Override
public void apply(RequestTemplate template) {
String traceId = TraceIdUtil.getTraceId();
if (StringUtils.isNotEmpty(traceId)) {
template.header("traceId", traceId);
}
}
}+@FeignClientconfiguration
package com.example.rtbootconsumer.config.interceptor;
import com.example.rtbootconsumer.common.utils.TraceIdUtil;
import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Configuration;
/**
* @Description Feign
**/
public class FeignRequestInterceptor implements RequestInterceptor {
/**
* @description: traceId
*/
@Override
public void apply(RequestTemplate template) {
String traceId = TraceIdUtil.getTraceId();
if (StringUtils.isNotEmpty(traceId)) {
template.header("traceId", traceId);
}
}
}package com.example.rtbootconsumer.feignservice;
import com.example.rtbootconsumer.pojo.User;
import com.example.rtbootconsumer.vo.ResultBody;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@FeignClient(name = "service-provider", path = "/testComm", url = "${addr.url}",configuration = FeignRequestInterceptor.class)
public interface UserFeignService {
@PostMapping(value = "/getUser")
public ResultBody<User> getUser(@RequestBody User user);
}
FeignRequestInterceptor2testlalala
package com.example.rtbootconsumer.config.interceptor;
import com.example.rtbootconsumer.common.utils.TraceIdUtil;
import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Configuration;
/**
* @Description Feign
**/
@Configuration
public class FeignRequestInterceptor2 implements RequestInterceptor {
/**
* @description: test
*/
@Override
public void apply(RequestTemplate template) {
String traceId = TraceIdUtil.getTraceId();
if (StringUtils.isNotEmpty(traceId)) {
template.header("test", "lalala");
}
}
}@FeignClientconfigurationclass
package com.example.rtbootconsumer.feignservice;
import com.example.rtbootconsumer.pojo.User;
import com.example.rtbootconsumer.vo.ResultBody;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@FeignClient(name = "service-provider", path = "/testComm", url = "${addr.url}",configuration = {FeignRequestInterceptor.class,FeignRequestInterceptor2.class})
public interface UserFeignService {
@PostMapping(value = "/getUser")
public ResultBody<User> getUser(@RequestBody User user);
@PostMapping(value = "/testList")
public ResultBody<List<User>> testList(@RequestBody List<User> list);
}
@FeignClientconfigurationconfiguration
@FeignClientconfiguration {FeignRequestInterceptor.class,FeignRequestInterceptor2.class})FeignRequestInterceptorFeignRequestInterceptor2 {FeignRequestInterceptor2.class,FeignRequestInterceptor.class})FeignRequestInterceptor2FeignRequestInterceptor