1. 程式人生 > 實用技巧 >SpringCloud Alibaba Nacos 服務發現 Feign進行消費

SpringCloud Alibaba Nacos 服務發現 Feign進行消費

使用Feign服務發現消費服務
  1. 啟動Nacos訪問地址為:http://101.200.201.195:8848/nacos/
  2. 啟動buscien-service-01業務服務,進行消費

準備工作完成後進行服務消費。

第一步:建立一個Maven工程buscien-service-03

第二步:編輯pom.xml,加入必要的依賴配置

<!-- 匯入bom依賴管理工程 -->
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.opensource</groupId>
                <artifactId>bom</artifactId>
                <version>1.0.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
<!-- 業務服務所需依賴 -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

在bom工程中已經全部定義好了對應的版本所以我們在業務工程中就不需要定義依賴版本了,統一在bom中進行維護。

第三步:建立一個SpringBoot啟動類,並且增加一個Http服務

/**
 * SpringCloud Alibaba 服務發現 Feign進行消費服務
 *
 * @author WuWenTao
 * @version 1.0
 * @date 2020/9/2 14:18
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class BuscienService03Appl {

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

@FeignClient("buscien-service-01-app")
interface BuscienDemo1Feign {

    @GetMapping("/buscien1/sayHello")
    public String sayHello(@RequestParam(name = "name") String name);
}

@RestController
@RequestMapping("/buscien3/")
class FeignConsumerController {

    @Autowired
    private BuscienDemo1Feign buscienDemo1Feign;

    @GetMapping("/consumer")
    public String consumer(@RequestParam String name) {
        return buscienDemo1Feign.sayHello(name);
    }

}

以上內容非常清晰。啟動類上增加@EnableFeignClients用於告訴框架掃描所有通過註解@FeignClient定義的feign客戶端。BuscienDemo1Feign介面中使用@FeignClient宣告代表他是一個Feign客戶端,並且引用的是buscien-service-01-app服務。FeignConsumerController中注入Feign呼叫即可。

第四步:編寫application.properties

server.port=2000
spring.application.name=buscien-service-03-app
spring.cloud.nacos.discovery.server-addr=101.200.201.195:8848

第五步:啟動BuscienService03Appl,啟動完成,在Nacos介面中能夠看到註冊上去的服務,訪問BuscienService03Appl中的服務介面:

http://localhost:3000/buscien3/consumer?name=ServiceConsumer

請求成功後返回:

hello ServiceConsumer
Feign傳遞請求頭

在做介面請求時,我們經常會在header頭中增加一些鑑權資訊,如token 或 jwt,那麼在通過fegin從A server去呼叫B server的介面時,如果B server的介面需要header資訊,我們需要將A sever獲取的header轉發到B上。可以通過實現Feign提供的攔截器來實現,建立FeignRequestInterceptor類進行傳遞請求頭。

/**
 * Feign傳遞請求頭
 *
 * @author WuWenTao
 * @version 1.0
 * @date 2020/9/2 17:12
 */
@Component
public class FeignRequestInterceptor implements RequestInterceptor {

    private Logger log = LoggerFactory.getLogger(FeignRequestInterceptor.class);

    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        //獲取請求頭
        HttpServletRequest request = attributes.getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                String values = request.getHeader(name);
                //將請求頭儲存到模板中
                template.header(name, values);

            }
            //如需傳遞各位如token
            // template.header("token", token);
            log.info("feign interceptor header:{}", template);
        }
    }
}

以上內容非常清晰,獲取當前請求正文請求頭存入Feign請求模板中。

原始碼地址:https://github.com/450255266/spring-cloud-alibaba

Nacos地址對外開放:http://101.200.201.195:8848/nacos/