Xxl-Job 实现简单的远程调用其他服务(RestTemplate和OpenFeign)

XXL-JOB配置nacos看上一个文章:

Xxl_job配置Nacosicon-default.png?t=N7T8https://blog.csdn.net/m0_57623482/article/details/141884303?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22141884303%22%2C%22source%22%3A%22m0_57623482%22%7D


这里有两种方法:

第一种:使用Spring框架的RestTemplate进行远程调用API

第二种:使用OpenFeign进行远程调用

本次远程调用其他服务,是在执行器的中使用的。


RestTemplate进行远程调用

  1. 使用RestTemplate需要在执行器中注入这个Bean(@Autowired),但是会报错

Consider defining a bean of type ‘org.springframework.web.client.RestTemplate‘ in your configuration

解决方法:

在config包下创建一个📎RestTemplateConfig.java,注入restTemplate对象

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        return builder.build();
    }

}

.

  1. 在执行器中注入DiscoverClient和RestTemplate,实现远程调用

    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;


    // 这里写你具体需要实现的定时任务
    @XxlJob("selectShopJobHandler")
    public void selectShop() throws Exception {
        // 获取远程服务对象
        List<ServiceInstance> instances = discoveryClient.getInstances("hmdp-service");
        ServiceInstance instance = instances.get(0);

        // 执行远程服务对象的API
        ResponseEntity<Object> response = restTemplate.exchange(
                instance.getUri() + "/shop/1",
                HttpMethod.GET,
                null,
                new ParameterizedTypeReference<Object>() {
                }
        );

        // 输出数据
        System.out.println(response.getBody());

    }

OpenFeign进行远程调用

引入依赖

在cart-service服务的pom.xml中引入OpenFeign的依赖和loadBalancer依赖:

<!--负载均衡器-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  <version>3.1.7</version>
</dependency>
<!-- openfeign -->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
  <version>3.1.8</version>
</dependency>

启用OpenFeign

我们在Application启动类上添加注解,启动OpenFeign功能:

编写OpenFeign客户端

其中代码如下:


@FeignClient("hmdp-service")
public interface HmdpClient {

    @GetMapping("shop/{id}")
    Result queryShopById(@PathVariable("id") Long id);

}

这里只需要声明接口,无需实现方法。接口中的几个关键信息:

  • @FeignClient("hmdp-service") :声明服务名称
  • @GetMapping :声明请求方式
  • @GetMapping("shop/{id}") :声明请求路径
  • @PathVariable("id") Long id :声明请求参数
  • Result :返回值类型(这个是我自定义的)

Result类: 需要导入lombok依赖

package com.xxl.job.executor.feign;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
    private Boolean success;
    private String errorMsg;
    private Object data;
    private Long total;

    public static Result ok(){
        return new Result(true, null, null, null);
    }
    public static Result ok(Object data){
        return new Result(true, null, data, null);
    }
    public static Result ok(List<?> data, Long total){
        return new Result(true, null, data, total);
    }
    public static Result fail(String errorMsg){
        return new Result(false, errorMsg, null, null);
    }
}

我们只需要直接调用这个方法,即可实现远程调用了。

使用FeignClient

最后,改造代码,直接调用HmdpClient的方法:

feign替我们完成了服务拉取、负载均衡、发送http请求的所有工作,还省去了RestTemplate的注册。

连接池

Feign底层发起http请求,依赖于其它的框架。其底层支持的http客户端实现包括:

  • HttpURLConnection:默认实现,不支持连接池
  • Apache HttpClient :支持连接池
  • OKHttp:支持连接池

因此我们通常会使用带有连接池的客户端来代替默认的HttpURLConnection。比如,我们使用OK Http.

引入依赖

在执行器xxl-job-executor-sample-springboot的pom.xml中引入依赖:

<!--OKHttp-->
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-okhttp</artifactId>
  <version>11.8</version>
</dependency>

开启连接池

在执行器xxl-job-executor-sample-springboo的application.properties配置文件中开启Feign的连接池功能:

# 开启okhttp
spring.cloud.openfeign.okhttp.enabled=true

重启服务,连接池就生效了。

在XLLoop(XXLJob)这样的分布式任务调度框架中引入OpenFeign作为远程服务调用客户端,首先需要做的是将OpenFeign依赖集成到你的项目中。以下是大致步骤: 1. **添加依赖**: - 在Maven项目中,添加OpenFeign的`io.github.openfeign:(feign-core)`和`io.github.openfeign:(feign-jackson)`依赖到你的pom.xml文件中。 ```xml <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-core</artifactId> <version>9.7.0</version> <!-- 更新至最新版本 --> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-jackson</artifactId> <version>9.7.0</version> <!-- 更新至最新版本 --> </dependency> ``` 2. **创建Feign接口**: - 定义一个接口,该接口对应你要调用的OpenFeign服务的API。例如,假设有个名为UserService的REST API,你会创建类似下面的接口: ```java public interface UserServiceFeign { @GetMapping("/users/{id}") User getUser(@PathVariable Long id); // 添加其他方法,如POST、PUT等 } ``` 3. **启用Feign Client**: - 在Spring Boot项目中,配置Feign client以自动扫描并调用相应的接口。 ```java @Configuration @EnableFeignClients(basePackages = "com.example.yourpackage") // 指定扫描包 public class FeignClientConfig { @Bean public OkHttpClient okHttpClient() { return new OkHttpClient(); } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } } ``` 4. **实际调用**: - 在你需要使用OpenFeign服务的地方,注入UserServiceFeign接口,并通过它来调用远程方法。 ```java @Autowired private UserServiceFeign userService; public void fetchUser(Long id) { User user = userService.getUser(id); // 这里会自动发送HTTP请求 // 处理返回结果 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值