首頁 > 軟體

Springboot 內部服務呼叫方式

2022-03-14 19:00:02

Eureka註冊的服務之間互相呼叫

1.請求方

啟動類新增註解,掃描Eureka 中的全部服務

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class LoginServiceApplication {    
    public static void main(String[] args) {
        new SpringApplicationBuilder(LoginServiceApplication.class).web(true).run(args);
    }    
}

pom.xml 新增包 (版本號 根據實際選擇)

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>

建立介面類

@FeignClient(name="hello-service") //spring service name
public interface FeignVehicle {
    
    @RequestMapping(value="/hello", method = RequestMethod.GET)
    @ResponseBody
    public List<Map> hello(@RequestParam Map<String,String> params);
}

實現類注入此介面類

@Autowired
FeignVehicle feignVehicle;

使用的時候直接按照正常呼叫方式即可

Map<String,String> map = new HashMap<String, String>();
feignVehicle.hello(map);

跨服務呼叫的時候出現token資訊取不到,在傳送方新增攔截器

@Configuration
public class FeignConfiguration {
 
    @Bean
    public RequestInterceptor requestInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate template) { 
                ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                        .getRequestAttributes();
                HttpServletRequest request = attributes.getRequest();  //當前服務token
 
                template.header("Authorization","Bearer " + request.getSession().getId()); //template 接收請求方token
            } 
        };
    }
}

2.接收方

請求 啟動類

@SpringBootApplication
@EnableEurekaClient
public class HelloServiceApplication {    
    public static void main(String[] args) {
        new SpringApplicationBuilder(HelloServiceApplication.class).web(true).run(args);
    }    
}

請求Controller

@Controller
@RequestMapping("/hello")
public class HelloController {    
    @RequestMapping(value="/hello",method = RequestMethod.GET)
    @ResponseBody
    public List<Map> hello(@RequestParam Map<String, String> queryParam) {
        return null;  
    }
}

多模組化,服務間呼叫的坑

問題背景

  • product 服務作為伺服器端,提供了一個 對外通訊Fegin介面 ProductClient,放在了com.imooc.product.client jar包下
  • order 服務作為使用者端,直接參照上面的jar,使用 ProductClient ,啟動主類後報下圖錯誤:

解決辦法

多模組化時,應該在order主類上新增下面圈出來的註解,這樣啟動後就能掃描這個包。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com