springboot 單體項目請求使用Feign

在單體項目中使用feign代替httpClient,調用接口

1、先導入feign依賴

<properties>
	<java.version>1.8</java.version>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<springfox.version>2.5.0</springfox.version>
	<httpcore>4.4.6</httpcore>
	<fastjson.version>1.2.47</fastjson.version>
	<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
</properties>

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

	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<optional>true</optional>
	</dependency>
	
	<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-openfeign</artifactId>
	</dependency>

	<dependency>
		<groupId>io.github.openfeign</groupId>
		<artifactId>feign-okhttp</artifactId>
		<version>10.2.3</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
		<version>${fastjson.version}</version>
	</dependency>

	<!-- 修改後立即生效,熱部署 -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>springloaded</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
	</dependency>
</dependencies>

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>${spring-cloud.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

2、啓動類上加入EnableFeignClients註解

@SpringBootApplication
@EnableFeignClients
public class JcfwproApplication {

    public static void main(String[] args) {
        SpringApplication.run(JcfwproApplication.class, args);
    }

}

3、配置feign配置項,使用okhttp來代替java的原生請求,請求頭中加入token驗證

import feign.Feign;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import okhttp3.ConnectionPool;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;

@Configuration
@Slf4j
@ConditionalOnClass(Feign.class)
@AutoConfigureBefore(FeignAutoConfiguration.class)
public class FeignConfiguration implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("token","eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrc2JtIjoiIiwib3JnbmFtZSI6Iua1meaxn-ecgeWNq-eUn-WSjOiuoeWIkuWxgCIsIm9yZ2NvZGUiOiIwMDI0ODIzNjUzMzAxMDMxMVA5MTcxIiwiamdibSI6IjAwMjQ4MjM2NTMzMDEwMzExUDkxNzEiLCJ6eWdoIjoiIiwia3NtYyI6IiIsImV4cCI6MTYwNjgzMDgyNCwiemNsc2giOiI5MDA2MjdDQS04Q0IyLTRDRDItODg3Mi01OTZFNTlFREMyOEMiLCJ6eXhtIjoi6LaF57qn566h55CG5ZGYIiwiaWF0IjoxNjA2ODAyMDI0fQ.CZbsorhOL7qTA0slhAeprUzqwnmH5xSp4TIyXKa92as");
        log.info("feign interceptor header:{}",requestTemplate);
    }

    @Bean
    public okhttp3.OkHttpClient okHttpClient(){
        return new okhttp3.OkHttpClient.Builder()
                .readTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(120, TimeUnit.SECONDS)
                .connectionPool(new ConnectionPool())
                .build();
    }
}

4、配置feignclient,分別包含get、post、以及webservice接口的調用

import com.winning.jcfwpro.config.FeignConfiguration;
import com.winning.jcfwpro.entity.ResponseEntity;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;

@FeignClient(value = "feignClientProxy",url = "${jcfwurl}",configuration = FeignConfiguration.class)
@Component
public interface FeignClientProxy {


    /**
     * 獲取系統菜單  get接口
     * @param applicationId
     * @return
     */
    @GetMapping(value = "/v1.0/services/permissions/getGncd")
    @ResponseBody
    String getGncd(@RequestParam(value="applicationId") String applicationId);

    /**
     * 獲取token post接口
     * @param param
     * @return
     */
    @PostMapping(value = "/v1.0/services/permissions/getToken", consumes = { MediaType.APPLICATION_JSON_VALUE })
    @ResponseBody
    ResponseEntity getToken(@RequestBody String param);

    /**
     * 個人信息註冊  webservice 接口
     * @return
     */
    @PostMapping(value = "/services/PlatformService", consumes = { MediaType.APPLICATION_XML_VALUE }, produces = MediaType.APPLICATION_XML_VALUE)
    String patientRegister(@RequestBody String param);

}

5、配置controller,來完成調用

import com.alibaba.fastjson.JSON;
import com.winning.jcfwpro.entity.LoginDto;
import com.winning.jcfwpro.entity.ResponseEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@RestController
@RequestMapping("/user")
@EnableSwagger2
@Api(description = "用戶接口")
public class SwaggerDemoController {

    @Autowired
    FeignClientProxy feignClientProxy;


    @ApiOperation(value = "測試接口",notes="新增註冊")
    @GetMapping(value = "/demo2")
    public String getDemo() {
        return ResponseEntity.error("新增成功.").toString();
    }

    /**
     *獲取token
     * @param loginDto
     * @return
     */
    @PostMapping(value = "/getToken")
    @ResponseBody
    public ResponseEntity getToken(@RequestBody LoginDto loginDto) {
        return feignClientProxy.getToken(JSON.toJSONString(loginDto));
    }

    /**
     * 功能菜單
     * @param applicationId
     * @return
     */
    @RequestMapping(value = "/getGncd")
    @ResponseBody
    public String getGncd(@RequestParam(name = "applicationId") String applicationId){
        return feignClientProxy.getGncd(applicationId);
    }

    /**
     *
     * @return
     */
    @PostMapping(value = "/patientRegister")
    String patientRegister(@RequestBody String param){
        return feignClientProxy.patientRegister(param);
    }


}

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章