spring-boot2.0 + spring cloud 的Finchley版的 M7 新用法解读

 
最近在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提示我会在最后贴出来
如下是官方上给出的:(错误的依赖)

  1. http://projects.spring.io/spring-cloud/    
  2. <parent>    
  3.     <groupId>org.springframework.boot</groupId>    
  4.     <artifactId>spring-boot-starter-parent</artifactId>    
  5.     <version>2.0.0.M7</version>    
  6. </parent>    
  7. <dependencyManagement>    
  8.     <dependencies>    
  9.         <dependency>    
  10.             <groupId>org.springframework.cloud</groupId>    
  11.             <artifactId>spring-cloud-dependencies</artifactId>    
  12.             <version>Finchley.M7</version>    
  13.             <type>pom</type>    
  14.             <scope>import</scope>    
  15.         </dependency>    
  16.     </dependencies>    
  17. </dependencyManagement>    
  18. <dependencies>    
  19.     <dependency>    
  20.         <groupId></groupId>    
  21.         <artifactId>spring-cloud-starter-config</artifactId>    
  22.     </dependency>    
  23.     <dependency>    
  24.         <groupId></groupId>    
  25.         <artifactId>spring-cloud-starter-eureka</artifactId>    
  26.     </dependency>    
  27. </dependencies>    
  28. <repositories>    
  29.     <repository>    
  30.         <id>spring-milestones</id>    
  31.         <name>Spring Milestones</name>    
  32.         <url>https://repo.spring.io/libs-milestone</url>    
  33.         <snapshots>    
  34.             <enabled>false</enabled>    
  35.         </snapshots>    
  36.     </repository>    
  37. </repositories>    

下图是从官方文档上截取下来的,有图有真相


2、从这里开始是本人踩坑后确认可用的依赖

1)创建maven 项目: zzf-spring-cloud-Finchley

  1. <parent>    
  2.     <groupId>org.springframework.boot</groupId>    
  3.     <artifactId>spring-boot-starter-parent</artifactId>    
  4.     <version>2.0.0.RELEASE</version>    
  5. </parent>    
  6.   
  7. <!-- 管理依赖  -->    
  8. <dependencyManagement>    
  9.     <dependencies>    
  10.         <dependency>    
  11.             <groupId>org.springframework.cloud</groupId>    
  12.             <artifactId>spring-cloud-dependencies</artifactId>    
  13.             <version>Finchley.M7</version>    
  14.             <type>pom</type>    
  15.             <scope>import</scope>    
  16.         </dependency>    
  17.     </dependencies>    
  18. </dependencyManagement>    
  19.   
  20. <!-- 注意: 这里必须要添加, 否者各种依赖有问题  -->    
  21. <repositories>    
  22.     <repository>    
  23.         <id>spring-milestones</id>    
  24.         <name>Spring Milestones</name>    
  25.         <url>https://repo.spring.io/libs-milestone</url>    
  26.         <snapshots>    
  27.             <enabled>false</enabled>    
  28.         </snapshots>    
  29.     </repository>    
  30. </repositories>    
  31.   
  32. <build>    
  33.     <plugins>    
  34.         <plugin>    
  35.             <groupId>org.springframework.boot</groupId>    
  36.             <artifactId>spring-boot-maven-plugin</artifactId>    
  37.         </plugin>    
  38.     </plugins>    
  39. </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 已经变化。

  1. <dependency>    
  2.     <groupId>org.springframework.cloud</groupId>    
  3.     <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>    
  4. </dependency>    

2)创建EurekaServerApplication.class 添加如下内容:
  1. @SpringBootApplication  
  2. @EnableEurekaServer  
  3. public class EurekaApplication {  
  4.     public static void main(String[] args) {  
  5.         SpringApplication.run(EurekaApplication.class, args);  
  6.     }  
  7. }  

3)在创建application.yml 文件添加如下内容:
  1. server:  
  2.   port: 9871  
  3. eureka:  
  4.   instance:  
  5.     hostname: localhost  
  6.   client:  
  7.     registerWithEureka: false  
  8.     fetchRegistry: false  
  9.     serviceUrl:  
  10.       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
同样首先还是添加依赖:

  1. <!--  eureka 里面已经包含 ribbon 了, 所以不用单独添加, ribbon依赖, 点击依赖就去看就知道了  -->  
  2. <dependency>  
  3.     <groupId>org.springframework.cloud</groupId>  
  4.     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId>org.springframework.cloud</groupId>  
  8.     <artifactId>spring-cloud-starter-openfeign</artifactId>  
  9. </dependency>  
  10. <dependency>  
  11.     <groupId>org.springframework.cloud</groupId>  
  12.     <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>  
  13. </dependency>  
  14. <dependency>  
  15.     <groupId>org.springframework.boot</groupId>  
  16.     <artifactId>spring-boot-starter-web</artifactId>  
  17. </dependency>  


接下来创建一个ConusemerApplication 的类
  1. @SpringBootApplication  
  2. @EnableDiscoveryClient  
  3. @EnableCircuitBreaker  
  4. @EnableFeignClients  
  5. public class ConsumerApplication {  
  6.     public static void main(String[] args) {  
  7.         SpringApplication.run(ConsumerApplication.class, args);  
  8.     }  
  9. }  


其中注解中的EnableDiscoveryClient 服务发现, EnableCircuitBreaker 开启容错,

EnableFeignClients 启动远程调用

在创建application.yml 文件, 添加如下文件信息
  1. spring:  
  2.   application:  
  3.     name: eureka-client-consumer  
  4. eureka:  
  5.   client:  
  6.     service-url:  
  7.            defaultZone: http://localhost:9871/eureka  
  8. server:  
  9.   port: 9091  

创建接口: RemoteInterface 添加如下信息,做为远程调用
  1. @FeignClient("eureka-client-provider")  
  2. public interface RemoteInterface {  
  3.     /** 
  4.      * 获取公司信息 
  5.      * @param companyName 
  6.      * @return 
  7.      */  
  8.     @RequestMapping(value = "/getCompanyInfoByProvider", method = RequestMethod.GET)  
  9.     public String getCompanyInfoByProvider(@RequestParam("companyName") String companyName);  
  10. }  


创建接口 HystrixClientConfigration 和实现类
  1. @FeignClient(name = "eureka-client-provider", configuration = HystrixClientConfigration.class)  
  2. public interface HystrixClientRemoteInterface {  
  3.         @RequestMapping(value = "/getTeamInfo", method = RequestMethod.GET)  
  4.     public String getTeamInfo(@RequestParam("teamName") String teamName);  
  5. }  

  6. public class HystrixClientConfigration implements HystrixClientRemoteInterface {  
  7.     @Override  
  8.     public String getTeamInfo(String teamName) {  
  9.         return "获取" + teamName + "失败。";  
  10.     }  
  11. }  

创建controller 类
  1. public class CompanyController {  
  2.     @Autowired  
  3.     private RemoteInterface remoteInterface;  
  4.     @Autowired  
  5.     private HystrixClientRemoteInterface hystrixClientRemoteInterface;  
  6.     
  7.     /** 
  8.      * 容错方法在接口实现类中 
  9.      * @param teamName 
  10.      * @return 
  11.      */  
  12.     @RequestMapping(value = "/teamInfo", method = RequestMethod.GET)  
  13.     @ResponseBody  
  14.     public String getTeamInfo(String teamName){  
  15.         return hystrixClientRemoteInterface.getTeamInfo(teamName);  
  16.     }  
  17.     
  18.     @HystrixCommand(fallbackMethod = "getCompanyInfoFallback")  
  19.     @RequestMapping(value = "/companyInfo", method = RequestMethod.GET)  
  20.     @ResponseBody  
  21.     public String getCompanyInfo(String companyName){  
  22.         return remoteInterface.getCompanyInfoByProvider(companyName);  
  23.     }  
  24.     
  25.     /** 
  26.      * 主要注意的是: 容错的方法, 参数要与请求的一致。 
  27.      * 容错返回的方法 
  28.      * @return 
  29.      */  
  30.     public String getCompanyInfoFallback(String companyName){  
  31.         return "this is fallBack, company name is " + companyName;  
  32.     }  

到这里我们的consumer 的模块功能就写好。
同理在项目 zzf-spring-cloud-Finchley 项目下创建模块命名为: eureka-client-provider
  • 老规矩先添加依赖:
  1. <dependency>  
  2.         <groupId>org.springframework.cloud</groupId>  
  3.         <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>  
  4. </dependency>  
  5. <dependency>  
  6.     <groupId>org.springframework.boot</groupId>  
  7.     <artifactId>spring-boot-starter-web</artifactId>  
  8. </dependency>  

  • 创建启动类 ProviderApplication
  1. @SpringBootApplication  
  2. @EnableDiscoveryClient  
  3. public class ProviderApplication {  
  4.     public static void main(String[] args) {  
  5.         SpringApplication.run(ProviderApplication.class, args);  
  6.     }  
  7. }  

  • 创建application.yml 文件 添加如下信息
  1. spring:  
  2.   application:  
  3.     name: eureka-client-provider  
  4. eureka:  
  5.   client:  
  6.     service-url:  
  7.            defaultZone: http://localhost:9871/eureka  
  8. server:  
  9.   port: 9090  

  • 创建controller 提供给客户端调用:
  1. @RestController  
  2. public class CompanyProviderController {  
  3.     @RequestMapping(value = "/getCompanyInfoByProvider", method = RequestMethod.GET)  
  4.     @ResponseBody  
  5.     public String getCompanyInfoByProvider(@RequestParam("companyName") String companyName){  
  6.         // 这里是要和数据库交互, 这里为了操作简单直接返回一个数据。  
  7.         return "provider 查询" + companyName + "公司信息";  
  8.     }  
  9.      
  10.     @RequestMapping(value = "/getTeamInfo", method = RequestMethod.GET)  
  11.     @ResponseBody  
  12.     public String getTeamInfo(@RequestParam("teamName") String teamName){  
  13.         // 返回团队信息。  
  14.         return "provider 查询" + teamName + "团队信息";  
  15.     }  
  16. }  

到这里我们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

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值