order-provider的bootstrap.yml文件配置:
spring:
main:
allow-bean-definition-overriding: true
application:
name: order-provider
cloud:
nacos:
discovery:
server-addr: http://127.0.0.1:8848/login
namespace: 26b33e81-a3a7-44a1-97a8-3e71b8dc4c84
group: DEV_GROUP
config:
server-addr: http://127.0.0.1:8848/login
file-extension: yml
namespace: 26b33e81-a3a7-44a1-97a8-3e71b8dc4c84
group: DEV_GROUP
shared-configs[0]:
data-id: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
group: DEV_GROUP
refresh: 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 {
@Resource
OrderServiceImpl 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 {
/**
* 熔断方法
* 返回值要和被熔断的方法的返回值一致
* 熔断方法不需要参数
*/
@Override
public List<Integer> getOrderBySupplierId(int supplierId) {
return null;
}
after-sale-provider的AdminRefundGoodsService文件:
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class AdminRefundGoodsService {
@Resource
private 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服务之间相互调用必须在同一命名空间下,否则调不到服务。