SpringCloud2模塊系列:Feign(服務間調用)

1 Feign

1.0 功能

服務間接口調用.

1.2 調用過程

  • 場景
    服務A調用服務B的接口.
  • 實現過程
    在服務A中使用Feign配置服務B的應用及路徑屬性.
  • 一句話
    在發起調用的服務中,配置被調用服務的信息.

1.3 流程圖

圖1 服務間調用示意圖

2 Usage

2.1 服務A-工單服務

2.1.0 啓動類

啓動類中添加註解@EnableFeignClients,打開Feign,服務間進行Http調用.

package com.personal.microspersonalworkorder;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @author xdq
 * @description Service Start.
 * @date 2020/6/18
 */
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class MicrospersonalWorkorderApplication {
	static Logger logger = LoggerFactory.getLogger(MicrospersonalWorkorderApplication.class);
	
	public static void main(String[] args) {
		SpringApplication.run(MicrospersonalWorkorderApplication.class, args);
		logger.info("WORKORDER啓動");
	}
}

2.1.2 接口類

在發起調用的服務A中,配置被調用服務的應用和URI,發起調用的服務接口如下:
參數屬性如下表:
@FeignClient(value,path)

序號 屬性 描述
1 value 被調用的服務B應用名稱,即配置文件中(*.yml)的application:name:micros-user
2 path 被調用的服務B的servlet路徑,即配置文件中(*.yml)的servlet: context-path: /user,如沒有配置,則省略參數path

@RequestMapping(value)
value爲服務B的完整URI.
方法中的參數前添加@RequestBody或@RequestParam,與被調用的服務B中接口完全一致.

package com.personal.microspersonalworkorder.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.Map;

/**
 * @author xdq
 * @description Call user service
 * @date 2020/6/18
 */
@FeignClient(value="micros-user",path="user")
public interface MicrospersonalUser {
    @RequestMapping("/api/page/user/query")
    Map queryFromUser(@RequestBody Map params);
}

2.1.3 服務類

package com.personal.microspersonalworkorder.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Map;
import com.personal.microspersonalworkorder.feign.MicrospersonalUser;

/**
 * @author xdq
 * @description Service funciton.
 * @date 2020/6/18
 */
@Service
@Transactional
public class UserInfosService {
    @Autowired
    private MicrospersonalUser microspersonalUser;

    public Map getUserInfos(Map params){
        return microspersonalUser.queryFromUser(params);
    }
}

2.2 服務B-人員信息服務

2.2.1 配置文件

配置信息摘要,調用服務B的其他服務需要進行配置的:

序號 屬性 描述
1 application:name:micros-user 服務應用名稱
2 servlet:context-path:/user 服務B全局路徑
spring:
  devtools: 
    restart: 
      enabled: true
  profiles: dev
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/data_repository?useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
  application: 
    name: micros-user

server:
  port: 8091
  servlet:
    session:
      timeout: PT10S
    context-path: /user
eureka: 
  client: 
    service-url: 
      defaultZone: http://localhost:8090/eureka/eureka

logging: 
  level: 
    root: INFO
  
pagehelper: 
  helperDialect: mysql 
  reasonable: true 
  supportMethodsArguments: true
  params: count=countSql

2.2.1 實體類

package com.personal.microspersonaluser;

import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @author xdq
 * @description Service Start.
 * @date 2020/6/18
 */
@SpringBootApplication
@MapperScan("com.personal.microspersonaluser.mapper")
@EnableSwagger2 
@EnableCaching 
@EnableEurekaClient
@EnableFeignClients
public class MicrospersonalUserApplication extends SpringBootServletInitializer{
    private static Logger logger = LoggerFactory.getLogger(MicrospersonalUserApplication.class);
    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application){
        return application.sources(MicrospersonalUserApplication.class);
    }
    public static void main(String[] args){
        SpringApplication.run(MicrospersonalUserApplication.class, args);
        logger.info("USER服務啓動");
    }
}

2.2.2 接口類

package com.personal.microspersonaluser.mapper;

import java.util.List;
import java.util.Map;
import java.util.HashMap;
import com.personal.microspersonaluser.po.UserInfos;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author xdq
 * @description Interface.
 * @date 2020/6/6
 */
public interface UserInfosMapper {
    public Integer addUser(UserInfos params);
    public Integer deleteUser(Integer id );
    public Integer editUser(UserInfos params);
    public List<UserInfos> queryUser(Map params);
    public UserInfos queryUserWithId(Integer id);
    public UserInfos loginByEmail(String email);
}

2.2.3 服務類

package com.personal.microspersonaluser.service;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.personal.microspersonaluser.mapper.UserInfosMapper;
import com.personal.microspersonaluser.po.UserInfos;

/**
 * @author xdq
 * @description User service.
 * @date 2020/6/6
 */
@Service
@Transactional
public class UserInfosService {
    @Autowired
    private UserInfosMapper userInfosMapper;

    public Integer addUser(UserInfos params){
        return userInfosMapper.addUser(params);
    }
    public Integer deleteUser(Integer id){
        return userInfosMapper.deleteUser(id);
    }
    public Integer editUser(UserInfos params){
        return userInfosMapper.editUser(params);
    }
    public List queryUser(Map params){
        return userInfosMapper.queryUser(params);
    }

    public UserInfos queryUserWithId(Integer id){
        return userInfosMapper.queryUserWithId(id);
    }
    public UserInfos loginByEmail(String email){
        return userInfosMapper.loginByEmail(email);
    }
}

【參考文獻】
[1]https://www.cnblogs.com/huangjuncong/p/9053576.html
[2]https://blog.csdn.net/qq_42815754/article/details/93341709
[3]https://blog.csdn.net/qq_29235677/article/details/91994857#feign%E6%96%B9%E5%BC%8F%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E9%97%B4%E7%9A%84%E8%B0%83%E7%94%A8
[4]https://www.cnblogs.com/a8457013/p/8290119.html

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