SpringCloud之Feign调用"/>
SpringCloud之Feign调用
order-provider的bootstrap.yml文件配置:
spring:main:allow-bean-definition-overriding: trueapplication:name: order-providercloud:nacos:discovery:server-addr: http://127.0.0.1:8848/loginnamespace: 26b33e81-a3a7-44a1-97a8-3e71b8dc4c84group: DEV_GROUPconfig:server-addr: http://127.0.0.1:8848/loginfile-extension: ymlnamespace: 26b33e81-a3a7-44a1-97a8-3e71b8dc4c84group: DEV_GROUPshared-configs[0]:data-id: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}group: DEV_GROUPrefresh: true
order-provider的pom.xml文件配置:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
order-provider的service文件注解:
import org.springframework.stereotype.Service;@Service
public class OrderServiceImpl {
order-provider的controller提供接口:
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;@RestController
@RequestMapping("/feignClient")
public class OrderInfoServiceController {@ResourceOrderServiceImpl orderServiceImpl;@GetMapping("/getOrderBySupplierId")public List<Integer> getOrderBySupplierId(int supplierId) {return orderServiceImpl.getOrderBySupplierId(supplierId);}
外部服务调用:
after-sale-provider的pom.xml文件配置:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>com.jumi.microservice</groupId><artifactId>order-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency>
after-sale-provider的feignclient的OrderClient文件:
import com.jumi.microservice.feignclient.fallback.OrderFallBack;
import org.springframework.cloud.openfeign.FeignClient;@FeignClient(name = "order-provider", fallback = OrderFallBack.class)
public interface OrderClient {/*** 被调用者对应方法的路由(类和方法上的@RequestMapping)* 这里需要注意的两个地方* 1、在这里使用的GetMapping注解要和被调用发一致,如果还有问题就用@RequestMapping* 2、@PathVariable需要设置value,如果不设置也不能成功启动* 注意:* 1、路径* 2、Http方法必须对应* 3、使用requestBody,应该使用@PostMapping* 4、多个参数的时候,通过@RequestParam("id") int id方式调用* 5、对象参数,应该使用@SpringQueryMap* 6、不支持集合参数,应该使用数组如:int[] buyerIdArr*/@GetMapping("/feignClient/getOrderBySupplierId")List<Integer> getOrderBySupplierId(@RequestParam("supplierId") int supplierId);
after-sale-provider的feignclient-fallback的OrderFallBack文件:
/*** @author scw* fallback实现必须声明为spring 的bean,不然会提示fallback实现没有被实例化的错误*/
import com.jumi.microservice.feignclient.OrderClient;
import org.springframework.stereotype.Component;@Component
public class OrderFallBack implements OrderClient {/*** 熔断方法* 返回值要和被熔断的方法的返回值一致* 熔断方法不需要参数*/@Overridepublic List<Integer> getOrderBySupplierId(int supplierId) {return null;}
after-sale-provider的AdminRefundGoodsService文件:
import org.springframework.stereotype.Service;
import javax.annotation.Resource;@Service
public class AdminRefundGoodsService {@Resourceprivate OrderClient orderClient;
after-sale-provider的启动类AfterSaleProviderApplication文件:
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;/*** Feign的源码实现的过程如下:* <p>* 1, 首先通过@EnableFeignCleints注解开启FeignCleint* 2, 根据Feign的规则实现接口,并加@FeignCleint注解* 3, 程序启动后,会进行包扫描,扫描所有的@FeignCleint的注解的类,并将这些信息注入到ioc容器中。* 4, 当接口的方法被调用,通过jdk的代理,来生成具体的RequestTemplate* 5, RequestTemplate在生成Request* 6, Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp* 7, 最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡* <p>* 在工程的启动类中,通过@EnableDiscoveryClient向服务中心注册;通过@EnableFeignClients注解开启Feign的功能*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class AfterSaleProviderApplication {
备注:Nacos服务之间相互调用必须在同一命名空间下,否则调不到服务。
更多推荐
SpringCloud之Feign调用
发布评论