`
zweichxu
  • 浏览: 134880 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

根据接口URL动态创建feign客户端

阅读更多

假设我有一个业务,根据一定规则轮流分配给两个不同的平台来完成。我定义任务数据发送接口,两家平台各自实现接口接收我发送的任务数据。如何根据两家平台提供的url动态创建feign客户端?

1.定义数据发送接口:

@FeignClient(name = "TaskSendClient")
public interface ITaskSendClient{ 
	@PostMapping(value="sendTask",consumes= MediaType.APPLICATION_JSON_UTF8_VALUE)
	SendTaskResp sendTask(@RequestBody TaskBean req);
}

 

2.定义feign客户端创建服务接口:

public interface IFeignClientCreateService {
  /**
     * @fun 通过url创建feign客户端实例
     * @param clientType feign接口类
     * @param url 动态url 
     * @return
     */
    public <T> T newClientByUrl(Class<T> clientType, String url);
}

 

 

3.实现feign客户端创建服务接口

@Service
@Import(FeignClientsConfiguration.class)
public class FeignClientCreateService implements IFeignClientCreateService {
    private final Feign.Builder urlBuilder; 
    
    private Map<String, Object> clientCached = new ConcurrentHashMap<>();
    
    @Autowired
    public FeignClientCreateServiceImpl(Decoder decoder, Encoder encoder, Client client, Contract contract) {
       
        if (client instanceof LoadBalancerFeignClient) { 
            client = ((LoadBalancerFeignClient)client).getDelegate();
        }
        
        urlBuilder = Feign.builder().client(client)
                                    .encoder(encoder)
                                    .decoder(decoder)
                                    .contract(contract);
    }

	@Override
	@SuppressWarnings("unchecked")
	public <T> T newClientByUrl(Class<T> clientType, String url) {
		Object obj = clientCached.get(url);
		if (obj != null) {
		    return (T)obj;
		}
		
		T client = urlBuilder.target(clientType, url);
		clientCached.put(url, client);
		return client;
	} 
}

 

 

4.调用

   (1)注入Feign客户端创建服务接口

 @Autowired
 private IFeignClientCreateService feignService;

   (2)动态生成客户端并调用:

 ITaskSendClient client = feignService.newClientByUrl(ITaskSendClient.class, url);
 SendTaskResp resp = client.sendTask(req)

   

分享到:
评论

相关推荐

    OpenFeign动态URL测试Demo

    // 创建Feign实例时应用拦截器 Feign.builder() .requestInterceptor(new DynamicUrlInterceptor()) .target(DemoService.class, "demo-service"); ``` 5. **集成Hystrix**:为了增加容错能力,可以将...

    Feign使编写java http客户端更容易.zip

    - **动态代理:** 当创建一个Feign客户端时,实际上是创建了一个接口的动态代理对象。当调用接口方法时,这个代理对象会将请求转换为HTTP调用。 - **模板化:** Feign通过模板引擎解析接口方法上的注解,生成对应...

    Feign使得编写JavaHTTP客户端更容易

    2. **模板化HTTP客户端**:Feign通过动态代理机制生成实现了接口的类,这个类会根据接口上的注解来构建并执行HTTP请求。这样,开发者无需手动处理HTTP请求的细节,只需关注业务逻辑。 3. **插件支持**:Feign支持...

    Spring Boot与Feign:微服务架构下的优雅通信

    ##### 3.3 定义Feign客户端接口 定义一个接口作为Feign客户端,使用Spring MVC的注解来指定请求的URL、HTTP方法、请求/响应体等。 ```java @FeignClient("service-provider") public interface ...

    SpringCloud-2.0-order-Feign-8005.zip

    1. 创建Feign接口,接口方法的注解与目标服务的HTTP方法和URL对应。 2. 在服务消费者应用中,使用`@FeignClient`注解指定目标服务的名字。 3. 在服务方法上添加HTTP方法和路径注解,如`@GetMapping`, `@PostMapping`...

    SpringCloud 集成Nacos、Feign,Feign采用httpClient方式

    4. 注册Feign客户端:使用`@FeignClient`注解定义客户端,指定服务ID(从Nacos服务发现中获取)和基础URL。 5. 使用Feign客户端:在业务代码中,通过Feign接口调用远程服务,Feign会自动处理请求的构建、发送和响应...

    Feign是一个Java到HTTP客户端绑定器

    - **动态代理**: 当你创建一个Feign接口的实例时,Feign会创建一个动态代理对象,这个代理对象会在运行时根据接口方法的注解生成HTTP请求。 - **请求构建**: Feign会根据注解解析出请求的URL、HTTP方法、请求头和...

    糞坑-SpringCloud中使用Feign的坑

    Feign是基于Java的注解和HTTP的客户端,它可以创建一个接口并将其动态地实现为HTTP客户端。通过在接口方法上使用注解,我们可以定义HTTP请求的方法(GET、POST等)、URL、查询参数以及请求头。Feign会根据这些信息...

    spring-cloud.zip

    6. **创建Feign实例**:最后,Spring会根据我们的接口和配置,动态生成Feign客户端的实现,我们可以直接注入并使用这个客户端来调用远程服务。 在"spring-cloud.zip"的项目中,开发者可能已经实现了一个简单的服务...

    skyeye.zip

    Feign会根据这些接口生成动态代理类,执行时动态组装HTTP请求并发送。 3. **自定义Feign客户端**: 在"skyeye.zip"中,可能包含了自定义Feign客户端的代码,这可能是为了满足特定的服务调用需求,例如添加全局的...

    studycloud.zip

    这个例子可能涵盖了从创建Feign接口、配置Feign客户端、服务调用到运行测试的完整过程,对于学习和理解Spring Cloud中Feign的使用非常有帮助。 总的来说,Feign通过声明式的方式简化了服务间的通信,降低了微服务...

    后端feign学习资料

    1. **Feign Client**:这是实际执行HTTP请求的对象,由Feign根据定义的接口动态生成。 2. **Decoder**:负责将服务器返回的响应内容解析为Java对象。 3. **Encoder**:将Java对象编码为请求体发送到服务器。 4. *...

    MySpringCloud4_Feign

    首先,我们需要在服务消费者端引入Feign客户端依赖,并定义一个接口,该接口中的方法对应于服务提供者提供的RESTful API。这些方法上的注解(如@RequestMapping)用于指定HTTP请求的方法、URL和参数。然后,通过@...

    venus-cloud-feign-1.5.x.rar_cloud_feign_formery87_spring

    2. **创建Feign客户端**:通过定义带有@FeignClient注解的接口,声明服务的调用方式和URL。 3. **配置Feign**:在Spring Boot的配置文件中,可以设置Feign的全局配置,如超时时间、连接池大小等。 4. **自定义配置...

    spring cloud feign demo

    - **Feign 实例化**:Feign 会基于接口创建一个动态代理类,当调用接口方法时,实际执行的是 Feign 的逻辑,将请求发送到指定的服务。 3. **Feign 配置** - **服务发现**:通过 `@FeignClient` 注解指定服务提供...

    Feign makes writing java http clients easier.zip

    - 创建 Feign 实例,Feign 会根据接口生成实现类,然后通过这个实例调用接口方法即可执行 HTTP 请求。 **实际应用示例** ```java @FeignClient("example-service") public interface ExampleService { @...

    springboot+springcloud+eureka+ribbon/feign

    而使用Feign时,我们定义一个接口,接口方法上使用@FeignClient注解指定服务名,Feign会根据服务名从Eureka获取服务实例,并自动生成实现该接口的客户端代码。 总结来说,"springboot+springcloud+eureka+ribbon/...

    演示【openFegin】服务之间相互调用

    - **创建Feign客户端接口**:定义服务消费者和服务提供者的交互接口,包括HTTP方法、URL路径以及请求参数。 - **启用OpenFeign**:在Spring Boot项目中添加`@EnableFeignClients`注解,启动Feign功能。 - **配置...

    feignproduct.rar

    3. **定义Feign客户端**:创建一个接口,接口中的方法对应要调用的服务的API,使用注解定义URL、HTTP方法等信息。 4. **配置Feign**:在Spring Boot的配置文件中,配置Feign的基本属性,如超时时间、日志级别等。 ...

    spring-cloud-feign-demo:春天云假装演示

    Spring Cloud Feign 是一个在 Spring Cloud 生态系统中用于创建客户端接口的声明式服务调用工具。它使得编写微服务间的远程调用变得极其简单,Feign 的设计灵感来源于 Netflix Feign,它允许开发者通过简单的注解...

Global site tag (gtag.js) - Google Analytics