1:项目启动顺序
- config-service :9181
- auth-service :9182 (有数据库)
- user-service :9183 (有数据库)
- exam-service :9184 (有数据库)
- gateway-service :9180 (有数据库)
- monitor-service :9186
- msc-service :9185
2:pom引入api
- config-service
- auth-service
<!-- user-service-api -->
<dependency>
<groupId>com.github.tangyi</groupId>
<artifactId>user-service-api</artifactId>
</dependency>
<!-- auth-service-api -->
<dependency>
<groupId>com.github.tangyi</groupId>
<artifactId>auth-service-api</artifactId>
</dependency>
<!-- exam-service-api -->
<dependency>
<groupId>com.github.tangyi</groupId>
<artifactId>exam-service-api</artifactId>
</dependency>
- user-service
<!-- user-service-api -->
<dependency>
<groupId>com.github.tangyi</groupId>
<artifactId>user-service-api</artifactId>
</dependency>
<!-- exam-service-api -->
<dependency>
<groupId>com.github.tangyi</groupId>
<artifactId>exam-service-api</artifactId>
</dependency>
<!-- msc-service-api -->
<dependency>
<groupId>com.github.tangyi</groupId>
<artifactId>msc-service-api</artifactId>
</dependency>
- exam-service
<!-- exam-service-api -->
<dependency>
<groupId>com.github.tangyi</groupId>
<artifactId>exam-service-api</artifactId>
</dependency>
- gateway-service
- monitor-service
- msc-service
<!-- msc-api -->
<dependency>
<groupId>com.github.tangyi</groupId>
<artifactId>msc-service-api</artifactId>
</dependency>
3:微服务通过Feign实现微服务相互调用
- 什么是feign?
feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service。Spring Cloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。
微服务架构服务实例众多,服务与服务之间如何调用,Spring Cloud提供了解决方案:伪装者 Feign。
Feign 是 Spring Cloud 的一个组件,也是一个WebService客户端,用于服务之间的调动。 - 怎么使用?
增加接口和 @FeignClient 注解
4:调用实例(就拿user-service-parent服务来说明)
特别说明:本项目(硕果云)使用consul+feign实现微服务调用
-
在user-service-api的pom文件中引入feign的依赖
-
创建UserServiceClient接口并添加@FeignClient注解
UserServiceClient接口会暴露出去,供其他服务调用
- @FeignClient注解
- 声明需要调用的微服务名称
- value :服务提供者的名称
-
增加 Hystrix 断路熔断机制
- @FeignClient(value = ServiceConstant.USER_SERVICE, configuration = CustomFeignConfig.class, fallbackFactory = UserServiceClientFallbackFactory.class)
- 增加 Feign接口实现类,实现方法作为断路器的回调方法
- feign接口的 @FeignClient注解增加 fallbackFactory参数,指向接口的用户断路器工厂(最终指向接口的实现类)。
- 本项目就是使用工厂模式来实现Fallback,同样工厂实现类也要交由spring管理,同时结合UserServiceClientFallbackImpl使用
- 这里有关于fallback 和fallbackFactory 参数的讲解,本项目使用fallbackFactory
-
启动类增加@EnableFeignClients注解
- 首先通过@EnableFeignCleints注解开启FeignCleint
- 根据Feign的规则实现接口,并加@FeignCleint注解
- 程序启动后,会进行包扫描,扫描所有的@ FeignCleint的注解的类,并将这些信息
注入到ioc容器中。 - 当接口的方法被调用,通过jdk的代理,来生成具体的RequesTemplate
- RequesTemplate在生成Request
- Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可
以是Okhttp - 最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。
// 扫描api包里的FeignClient
@EnableFeignClients(basePackages = {CommonConstant.BASE_PACKAGE})
- 一切准备就绪了,那就可以在其他服务进行调用了
- 调用方式
- 你需要在你要调用api的pom文件引入
<!-- user-api -->
<dependency>
<groupId>com.github.tangyi</groupId>
<artifactId>user-service-api</artifactId>
</dependency>
- 其次就像controller引入service一样通过@Autowired注解进行调用了
@Autowired
private UserServiceClient userServiceClient;
- 或者通过另外的形式