您好,登錄后才能下訂單哦!
前言
SpringCloud 是微服務中的翹楚,最佳的落地方案。
Eureka 作為注冊中心,是 SpringCloud 體系中最重要最核心的組件之一。
Feign 使用接口加注解的方式調用服務,配合 Eureka 還能實現負載均衡。
源碼
GitHub
環境
JDK 1.8.0 +
Maven 3.0 +
SpringBoot 2.0.3
SpringCloud Finchley.RELEASE
開發工具
IntelliJ IDEA
正文
commons 工程
commons 工程 - POM 文件
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.zwc
springcloud-eureka-commons
1.0
springcloud-eureka-commons
公用工程
jar
UTF-8
1.8
Cairo-SR3
Finchley.RELEASE
io.spring.platform
platform-bom
${platform-bom.version}
pom
import
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud-dependencies.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
配置一些共用依賴
commons 工程 - 項目結構
service 工程
此工程下有四個模塊:一個注冊中心,兩個提供者以及一個消費者
registry-service(注冊中心)
registry-service - POM 文件
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.zwc
springcloud-eureka-service
1.0
com.zwc
springcloud-eureka-registry-service
0.0.1-SNAPSHOT
springcloud-eureka-registry-service
注冊中心
jar
com.zwc
springcloud-eureka-commons
1.0
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-maven-plugin
主要是加入 spring-cloud-starter-netflix-eureka-server 依賴
registry-service - application.yml 配置文件
# 端口
server:
port: 8761
# 應用名稱
spring:
application:
name: eurka-server
eureka:
instance:
# 使用 ip 代替實例名
prefer-ip-address: true
# 實例的主機名
hostname: ${spring.cloud.client.ip-address}
# 實例的 ID 規則
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
client:
# 是否向注冊中心注冊自己
registerWithEureka: false
# 是否向注冊中心獲取注冊信息
fetchRegistry: false
serviceUrl:
# 注冊中心地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
這里使用了默認的 8761 端口,當然也可以更改,不過在發現調用服務端的注冊中心地址端口要與它一致
registry-service - 啟動類
package com.zwc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class SpringcloudEurekaRegistryServiceApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaRegistryServiceApplication.class, args);
}
}
在啟動類中添加 @EnableEurekaServer 注解表示此工程是注冊中心
registry-service - 啟動項目
1. 項目啟動成功后訪問 http://localhost:8761/ 即可看到 eureka-server 主頁面
Provider(提供者)
Provider - POM 文件
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.zwc
springcloud-eureka-providerfirst-service
1.0
com.zwc
springcloud-eureka-providerfirst-service-core
1.0
springcloud-eureka-providerfirst-service-core
提供者一號服務工程 - 核心
jar
com.zwc
springcloud-eureka-commons
1.0
com.zwc
springcloud-eureka-providerfirst-service-api
1.0
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-maven-plugin
主要是加入 spring-cloud-starter-netflix-eureka-client 依賴
Provider - application.yml 配置文件
# 端口
server:
port: 8090
# 應用名稱
spring:
application:
name: say-hello
eureka:
instance:
# 使用 ip 代替實例名
prefer-ip-address: true
# 實例的主機名
hostname: ${spring.cloud.client.ip-address}
# 實例的 ID 規則
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
client:
serviceUrl:
# 注冊中心地址
defaultZone: http://${eureka.instance.hostname}:8761/eureka/
注意此處配置注冊中心地址的端口為 8761 也就是上面注冊中心工程配置的端口
有兩個消費者工程,只有此處的端口不一致,此處端口為 8090,另一個端口為 8091。就不再贅述
兩個消費者工程作用是為了達到負載均衡的效果
spring.application.name:應用名稱,被消費者調用時需要用到
Provider - controller 前端控制器
package com.zwc.providerfirst.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName SayHelloController
* @Desc TODO Say Hello
* @Date 2019/5/15 15:28
* @Version 1.0
*/
@RestController
public class SayHelloController {
/*
* @ClassName SayHelloController
* @Desc TODO 讀取配置文件中的端口
* @Date 2019/5/15 15:49
* @Version 1.0
*/
@Value("${server.port}")
private String port;
/*
* @ClassName SayHelloController
* @Desc TODO Say Hello
* @Date 2019/5/15 15:30
* @Version 1.0
*/
@RequestMapping("/hello")
public String hello(){
return "Hello Spring Cloud!!!port:" + port;
}
}
提供一個服務:輸出 Hello 和端口
Provider - 啟動類
package com.zwc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class SpringcloudEurekaProviderfirstServiceCoreApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaProviderfirstServiceCoreApplication.class, args);
}
}
添加 @EnableEurekaClient 注解表示此工程可以向注冊中心提供服務
Provider - 啟動項目
1. 項目啟動成功后訪問 http://localhost:8090/hello 看到輸出內容 'Hello Spring Cloud!!!port:8090'
2. 刷新 http://localhost:8761/(注冊中心)可以看到服務已經被注冊進來了
3. 同理,還有一個提供者工程只是端口不一致,也啟動起來
4. 項目啟動成功后訪問 http://localhost:8091/hello 看到輸出內容 'Hello Spring Cloud!!!port:8091'
5. 再次刷新 http://localhost:8761/(注冊中心)可以看到相同的服務有兩個提供者
Consumer(消費者)
Consumer - POM 文件
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.zwc
springcloud-eureka-consumer-service
1.0
com.zwc
springcloud-eureka-consumer-service-core
1.0
springcloud-eureka-consumer-service-core
消費者服務工程 - 核心
jar
com.zwc
springcloud-eureka-commons
1.0
com.zwc
springcloud-eureka-consumer-service-api
1.0
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.boot
spring-boot-maven-plugin
與提供者一致,需要加入 spring-cloud-starter-netflix-eureka-client 依賴
還需要加入 Feign 的起步依賴 spring-cloud-starter-openfeign
Consumer - application.yml 配置文件
# 端口
server:
port: 8080
# 應用名稱
spring:
application:
name: service-feign
eureka:
instance:
# 使用 ip 代替實例名
prefer-ip-address: true
# 實例的主機名
hostname: ${spring.cloud.client.ip-address}
# 實例的 ID 規則
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
client:無錫看婦科的醫院 http://www.ytsg120.cn/
serviceUrl:
# 注冊中心地址
defaultZone: http://${eureka.instance.hostname}:8761/eureka/
注意此處配置注冊中心地址的端口為 8761 也就是上面注冊中心工程配置的端口
spring.application.name:應用名稱,被消費者調用時需要用到,它在消費的同時也可以被消費
Consumer - 服務調用
package com.zwc.consumer.api.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @ClassName FeignApi
* @Desc TODO 使用 Feign 調用 Api - 接口
* @Date 2019/5/15 16:11
* @Version 1.0
*/
@FeignClient("say-hello")
public interface FeignApi {
/*
* @ClassName FeignApi
* @Desc TODO 通過 say-hello 服務名調用 /hello 方法
* @Date 2019/5/15 16:17
* @Version 1.0
*/
@RequestMapping("/hello")
String hello();
}
通過 @FeignClient("say-hello") 注解來指定調用哪個服務
say-hello 就是提供者的 spring.application.name:應用名稱
String hello();:可以發現,此方法就是提供者 SayHelloController 中的方法,只不過這里要定義成接口
注意要與提供者具有相同返回值,相同方法名以及相同參數
Consumer - controller 前端控制器
package com.zwc.consumer.controller;
import com.zwc.consumer.api.feign.FeignApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @ClassName FeignController
* @Desc TODO 使用 Feign 調用 Api - 前端控制器
* @Date 2019/5/15 16:18
* @Version 1.0
*/
@RestController
public class FeignController {
@Autowired(required = false)
private FeignApi feignApi;
/*
* @ClassName FeignController
* @Desc TODO 調用 Say Hello 方法
* @Date 2019/5/15 16:20
* @Version 1.0
*/
@RequestMapping("/feign")
public String feign(){
return feignApi.hello();
}
}
使用 @Autowired 注解裝配 Bean,通過此 Bean 中的方法調用服務
此類對外暴露接口,調用的實則是提供者的服務
Consumer - 啟動類
package com.zwc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class SpringcloudEurekaConsumerServiceCoreApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaConsumerServiceCoreApplication.class, args);
}
}
添加 @EnableEurekaClient 注解表示此工程可以向注冊中心提供服務
添加 @EnableFeignClients 注解表示開啟 Feign 功能進行遠程調用
Consumer - 啟動項目
1. 項目啟動成功后多次訪問 http://localhost:8080/feign
2. 可以發現輪流輸出 'Hello Spring Cloud!!!port:8090' 和 'Hello Spring Cloud!!!port:8091'
3. 此時已經達到了負載均衡的效果
4. 再次刷新 http://localhost:8761/(注冊中心)可以看到此時多了一個消費者
service 工程 - 項目結構
把多工程項目使用 IntelliJ IDEA 打開
把項目從 GitHub 中下載到你的本地
打開 IntelliJ IDEA
點擊 File -> Open
打開你下載到本地的項目目錄
springcloud-eureka -> springcloud-eureka-service(選擇打開此工程)
打開 service 工程后
再次點擊 File -> Project Structrue
選擇 Modules,點擊 '+' 符號
點擊 Import Module
還是打開你下載到本地的項目目錄
springcloud-eureka -> springcloud-eureka-commons -> pom.xml
點擊 OK
點擊 Next,Finish
點擊 Apply,OK
擴展
CentOS7中使用Docker簡單部署SpringCloud項目
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。