最近在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>
下圖是從官方文檔上截取下來的,有圖有真相
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiN0gjMxAjM4ETMxMDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
2、從這裡開始是本人踩坑後确認可用的依賴
1)建立maven 項目: zzf-spring-cloud-Finchley
2)添加下面的依賴: https://projects.spring.io/spring-boot/#quick-start
- <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 {
- @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;
- @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);
- }
- 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