一、創建maven父工程(pom)
pom.xml如下:
<?xml version="1.0"encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.snowlink</groupId>
<artifactId>springCloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.5.RELEASE</version>
</parent>
<modules>
<module>springCloud-eureka-server</module>
<module>springCloud-eureka-client</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
二、創建兩個子工程
兩個子工程都是springBoot的項目,一個是服務端(server),一個是客戶端(client)
三、服務端配置
1、 由於服務端在啟動類上需要加載@EnableEurekaServer注解,所以服務端的pom.xml文件中需要添加依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
2、 服務端啟動類
package org.springCloud.eureka.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
publicclass App
{
publicstaticvoid main( String[] args )
{
SpringApplication.run(App.class, args);
System.out.println( "Hello World!" );
}
}
3、特別注意:
1、com.sun.jersey.api.client.ClientHandlerException:java.net.ConnectException: Connection refused: connect
或者com.netflix.discovery.shared.transport.TransportException: Cannotexecute request on any known server
原因如下:
在默認設置下,Eureka服務注冊中心也會將自己作為客戶端來嘗試注冊它自己,所以我們需要禁用它的客戶端注冊行為。
禁止方式如下:在application.yml配置文件中增加以下內容
registerWithEureka:false
fetchRegistry:false
如下所示:
server:
port: 7070
eureka:
client:
registerWithEureka:false
fetchRegistry:false
serviceUrl:
defaultZone: http://localhost:7070/eureka/
instance:
hostname: localhost
重新啟動即可。
瀏覽器訪問localhost:7070就可以看到
四、客戶端配置
1、application.yml配置:
server:
port: 8081
eureka:
client:
registerWithEureka:false
fetchRegistry:false
serviceUrl:
defaultZone: http://localhost:8080/eureka/
spring:
application:
name: service(服務名稱)
2、入口類:
package org.springCloud.eureka.client;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Hello world!
*
*/
@SpringBootApplication
@EnableDiscoveryClient
@RestController
publicclass App
{
publicstaticvoid main( String[] args )
{
SpringApplication.run(App.class, args);
System.out.println( "Hello World!" );
}
@GetMapping("/service")
public String service() {
return"service";
}
}
注意:
光是注冊了服務還不行,這里可以再配一個網關,讓服務調用有統一的入口.
網關用於請求轉發和負載均衡,類似於Nginx,
五、網關配置:
1、 pom.xml配置:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
2、 application.yml配置
server:
port: 8082
eureka:
client:
registerWithEureka:false
fetchRegistry:false
serviceUrl:
defaultZone: http://localhost:8080/eureka/
spring:
application:
name: gateway
zuul:
routes:
service: service(用於發布的服務,可以是多個)
3、啟動類配置:
package org.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
/**
* Hello world!
*
*/
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
publicclass App
{
publicstaticvoid main( String[] args )
{
SpringApplication.run(App.class, args);
}
}
注意(異常):
java.lang.NoClassDefFoundError:org/springframework/boot/context/embedded/FilterRegistrationBean
原因分析:找不org.springframework.boot.context.embedded.FilterRegistrationBean,查看源碼發現:在1.5.6版本中FilterRegistrationBean的包路徑已經改為org.springframework.boot.web.servlet.org.springframework.boot.web.servlet.FilterRegistrationBean,所以引發錯誤。
解決辦法:既然是引用了以前的包路徑,說明是pom.xml文件的問題。檢查發現spring-cloud-dependencies 的版本沒有更新,改為Dalston.SR3即可解決問題。