最近在spring 官网上很火热, 因为spring-boot 2.0 版本和spring-cloud Finchley 的realese。
今天使用了sc 的F版的M7 进行了sc 的案例的操作, 遇到了不少问题, 接下来和各位分享一下:
1、添加依赖时踩的坑:
根据官方文档添加依赖踩到的BUG(该BUG 我已经在spring-boot 上提了issue)。
BUG:java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
详细的bug提示我会在最后贴出来
如下是官方上给出的:(错误的依赖)
- http://projects.spring.io/spring-cloud/
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.0.M7</version>
- </parent>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>Finchley.M7</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <dependencies>
- <dependency>
- <groupId></groupId>
- <artifactId>spring-cloud-starter-config</artifactId>
- </dependency>
- <dependency>
- <groupId></groupId>
- <artifactId>spring-cloud-starter-eureka</artifactId>
- </dependency>
- </dependencies>
- <repositories>
- <repository>
- <id>spring-milestones</id>
- <name>Spring Milestones</name>
- <url>https://repo.spring.io/libs-milestone</url>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
- </repositories>
下图是从官方文档上截取下来的,有图有真相
2、从这里开始是本人踩坑后确认可用的依赖
1)创建maven 项目: zzf-spring-cloud-Finchley
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.0.RELEASE</version>
- </parent>
- <!-- 管理依赖 -->
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>Finchley.M7</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
- <repositories>
- <repository>
- <id>spring-milestones</id>
- <name>Spring Milestones</name>
- <url>https://repo.spring.io/libs-milestone</url>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
- </repositories>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
到这里基本的spring-boot 和 spring-cloud 的基础依赖就添加好了。
3、可用案例
在开始之前,先说明一下,在Finchley M7版这里netflix 的相关包, 已经全部封装在
spring-cloud-netflix 下面了,github 上的地址为:
https://github.com/spring-cloud/spring-cloud-netflix
实际依赖artifactId 在spring-cloud-starter-netflix 文件下面
下面正式开始案例介绍:
1)在 zzf-spring-cloud-Finchley 项目下面创建一个Module 命名为 eureka-server,先是添加 eureka-server 的相关依赖 , 这个依赖需要注意的是eureka server 的依赖artifactId 已经变化。
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
- </dependency>
2)创建EurekaServerApplication.class 添加如下内容:
- @SpringBootApplication
- @EnableEurekaServer
- public class EurekaApplication {
- public static void main(String[] args) {
- SpringApplication.run(EurekaApplication.class, args);
- }
- }
3)在创建application.yml 文件添加如下内容:
- server:
- port: 9871
- eureka:
- instance:
- hostname: localhost
- client:
- registerWithEureka: false
- fetchRegistry: false
- serviceUrl:
- defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4)到这里eureka-server 的创建就完成了, 启动项目并访问如下地址 : http://localhost:9871/
出现如下界面说名成功了:
同理在项目 zzf-spring-cloud-Finchley 项目下创建模块命名为: eureka-client-consumer
这里连同hystrix, feign, ribbon 都使用了, 同样这三个的 artifactId 都有变化, hystrix ribbon 也都是在spring-cloud-netflix 下面, 而feign 变成了
spring-cloud-starter-openfeign
同样首先还是添加依赖:
- <!-- eureka 里面已经包含 ribbon 了, 所以不用单独添加, ribbon依赖, 点击依赖就去看就知道了 -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-openfeign</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
接下来创建一个ConusemerApplication 的类
- @SpringBootApplication
- @EnableDiscoveryClient
- @EnableCircuitBreaker
- @EnableFeignClients
- public class ConsumerApplication {
- public static void main(String[] args) {
- SpringApplication.run(ConsumerApplication.class, args);
- }
- }
其中注解中的EnableDiscoveryClient 服务发现, EnableCircuitBreaker 开启容错,
EnableFeignClients 启动远程调用
在创建application.yml 文件, 添加如下文件信息
- spring:
- application:
- name: eureka-client-consumer
- eureka:
- client:
- service-url:
- defaultZone: http://localhost:9871/eureka
- server:
- port: 9091
创建接口:
RemoteInterface 添加如下信息,做为远程调用
- @FeignClient("eureka-client-provider")
- public interface RemoteInterface {
- /**
- * 获取公司信息
- * @param companyName
- * @return
- */
- @RequestMapping(value = "/getCompanyInfoByProvider", method = RequestMethod.GET)
- public String getCompanyInfoByProvider(@RequestParam("companyName") String companyName);
- }
创建接口
HystrixClientConfigration 和实现类
- @FeignClient(name = "eureka-client-provider", configuration = HystrixClientConfigration.class)
- public interface HystrixClientRemoteInterface {
- @RequestMapping(value = "/getTeamInfo", method = RequestMethod.GET)
- public String getTeamInfo(@RequestParam("teamName") String teamName);
- }
- public class HystrixClientConfigration implements HystrixClientRemoteInterface {
- @Override
- public String getTeamInfo(String teamName) {
- return "获取" + teamName + "失败。";
- }
- }
创建controller 类
- public class CompanyController {
- @Autowired
- private RemoteInterface remoteInterface;
- @Autowired
- private HystrixClientRemoteInterface hystrixClientRemoteInterface;
- /**
- * 容错方法在接口实现类中
- * @param teamName
- * @return
- */
- @RequestMapping(value = "/teamInfo", method = RequestMethod.GET)
- @ResponseBody
- public String getTeamInfo(String teamName){
- return hystrixClientRemoteInterface.getTeamInfo(teamName);
- }
- @HystrixCommand(fallbackMethod = "getCompanyInfoFallback")
- @RequestMapping(value = "/companyInfo", method = RequestMethod.GET)
- @ResponseBody
- public String getCompanyInfo(String companyName){
- return remoteInterface.getCompanyInfoByProvider(companyName);
- }
- /**
- * 主要注意的是: 容错的方法, 参数要与请求的一致。
- * 容错返回的方法
- * @return
- */
- public String getCompanyInfoFallback(String companyName){
- return "this is fallBack, company name is " + companyName;
- }
到这里我们的consumer 的模块功能就写好。
同理在项目 zzf-spring-cloud-Finchley 项目下创建模块命名为: eureka-client-provider
- 老规矩先添加依赖:
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- 创建启动类 ProviderApplication
- @SpringBootApplication
- @EnableDiscoveryClient
- public class ProviderApplication {
- public static void main(String[] args) {
- SpringApplication.run(ProviderApplication.class, args);
- }
- }
- 创建application.yml 文件 添加如下信息
- spring:
- application:
- name: eureka-client-provider
- eureka:
- client:
- service-url:
- defaultZone: http://localhost:9871/eureka
- server:
- port: 9090
- 创建controller 提供给客户端调用:
- @RestController
- public class CompanyProviderController {
- @RequestMapping(value = "/getCompanyInfoByProvider", method = RequestMethod.GET)
- @ResponseBody
- public String getCompanyInfoByProvider(@RequestParam("companyName") String companyName){
- // 这里是要和数据库交互, 这里为了操作简单直接返回一个数据。
- return "provider 查询" + companyName + "公司信息";
- }
- @RequestMapping(value = "/getTeamInfo", method = RequestMethod.GET)
- @ResponseBody
- public String getTeamInfo(@RequestParam("teamName") String teamName){
- // 返回团队信息。
- return "provider 查询" + teamName + "团队信息";
- }
- }
到这里我们Spring-Cloud Finchley M7 的Eureka 注册中心 和 消费者和生产者案例就创建成功了。
启动三个工程分别为: eureka-server , eureka-client-consumer, eureka-client-provider
在访问:
localhost:9091/company/companyInfo?companyName=springcloud.cn
容错:
正常访问:
访问下面的地址同理:
localhost:9091/company/teamInfo?teamName=springcloud.cn
文章过程拆成了好多节,继续观看地址为:spring-boot2.0 + spring cloud 的Finchley版的 M7 新用法解读2