分散式體驗
技術標籤:Java學習筆記
springcloud
springCloud是分散式微服務整體解決方案。
Spring Cloud 為開發者提供了在分散式系統(配置管理,[服務發現,熔斷,路由,微代理,控制匯流排,一次性token,全域性瑣,leader選舉,分散式session,叢集狀態)中快速構建的工具,使用Spring Cloud的開發者可以快速的啟動服務或構建應用、同時能夠快速和雲平臺資源進行對接。
SpringCloud分散式開發五大常用元件:
- 服務發現——Netflix Eureka
- 客服端負載均衡——Netflix Ribbon
- 斷路器——Netflix Hystrix
- 服務閘道器——Netflix Zuul
- 分散式配置——Spring Cloud Config
springCloud體驗
eureka 服務發現與註冊
RestTemplate 傳送http請求
遠端呼叫
dubbo+zookeep體驗
dubbo是一個遠端呼叫服務的分散式框架,可以實現遠端通訊、動態配置、地址路由等等功能。它可以通過整合註冊中心,來動態地治理服務釋出和服務呼叫。相當於把服務註冊和釋出推送的功能分攤給了(zookeeper)註冊中心
Dubbo實現服務呼叫是通過RPC的方式,即客戶端和服務端共用一個介面(將介面打成一個jar包,在客戶端和服務端引入這個jar包),客戶端面向介面寫呼叫,服務端面向介面寫實現,中間的網路通訊交給框架去實現
Zookeeper 是 Apacahe Hadoop 的子專案,是一個樹型的目錄服務,支援變更推送,適合作為 Dubbo 服務的註冊中心。【參考】
- 安裝zookeep
可以通過docker容器快速安裝 - 引入需要的依賴
<!--引入dubbo-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!--引入zookeeper客戶端工具-->
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
- 服務提供端
----服務介面
package com.xiaoai.ticket.service;
public interface TicketService {
public String getTicket();
}
----服務介面實現
@Component
@com.alibaba.dubbo.config.annotation.Service // 該註解即把服務釋出出去
public class TicketServiceImpl implements TicketService{
@Override
public String getTicket() {
return "《厲害了,我的國》";
}
}
----配置檔案
dubbo:
application:
name: provider-ticket
registry:
address: zookeeper://192.168.121.128:2181
scan:
base-packages: com.xiaoai.ticket.service
- 服務消費端
----建立一樣的介面
package com.xiaoai.ticket.service;
public interface TicketService {
public String getTicket();
}
----相關服務中呼叫遠端服務
@Service
public class UserService {
@Reference // 引入相關遠端服務
TicketService ticketService;
public void hello(){
String ticket = ticketService.getTicket();
System.out.println("拿到票:"+ticket);
}
}
----配置檔案
dubbo:
application:
name: consumer-user
registry:
address: zookeeper://192.168.121.128:2181
使用dubbo注意在啟動器中開啟dubbo支援:【@EnableDubbo】
- 測試
----在客戶端呼叫遠端服務
@RunWith(SpringRunner.class)
@SpringBootTest
class ConsumerUserApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.hello();
}
}
----結果
拿到票:《厲害了,我的國》
dubbo+nacos+zuul體驗
dubbo 遠端呼叫
nacos 配置中心、服務發現
zuul 閘道器路由
例子:應用專案去呼叫消費服務專案,消費服務專案去呼叫提供服務專案
- 引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dubbo</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
在啟動類中添加註解【@EnableDiscoveryClient】開啟服務發現
服務介面可單獨提取作api專案,在實現專案中引入api專案實現相關介面即可,在其他專案需要另一個專案的服務時直接引入api專案即可。
----服務介面
package com.xiaowei.service2.api;
public interface ProviderService {
public String service();
}
----服務介面實現
package com.xiaowei.service2.service;
@org.apache.dubbo.config.annotation.Service
public class ProviderServiceImpl implements ProviderService {
@Override
public String service() {
return "Provider Invoke【提供服務端service2-server】執行...";
}
}
----配置檔案
server:
port: ${port:56040} #啟動埠 命令列注入
servlet:
context-path: /service2
spring:
application:
name: service2
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #
namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c
cluster-name: DEFAULT
# 連線配置中心配置對應配置檔案,通過配置中心可獲取專案相關配置,
# 該專案暫未有其他配置,只是先配置連線 即可不配置
# config:
# server-addr: 127.0.0.1:8848 # 配置中心地址
# file-extension: yaml # 配置檔案字尾 預設是context-path.字尾來查詢配置中心的檔案
# namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c # 開發環境
# group: XIAOAI_MICROSERVICE_GROUP # 業務組,可理解為那個專案
dubbo:
scan:
base-packages: com.xiaowei.service2.service
protocol:
name: dubbo
port: ${dubbo_port:20891}
registry:
address: nacos://127.0.0.1:8848
application:
qos-enable: false
consumer:
check: false
- 消費服務端
----服務介面
package com.xiaowei.service1.api;
public interface ConsumerService {
public String service();
}
----服務介面實現
package com.xiaowei.service1.service;
@org.apache.dubbo.config.annotation.Service
public class ConsumerServiceImpl implements ConsumerService {
@org.apache.dubbo.config.annotation.Reference
private ProviderService providerService;
@Override
public String service() {
return "Consumer Invoke【消費服務端service1-server】執行...呼叫【提供服務端】:\n"+providerService.service();
}
}
----配置檔案
server:
port: ${port:56030} #啟動埠 命令列注入
servlet:
context-path: /service1
spring:
application:
name: service1
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #
namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c
cluster-name: DEFAULT
# 連線配置中心配置對應配置檔案,通過配置中心可獲取專案相關配置,
# 該專案暫未有其他配置,只是先配置連線 即可不配置
# config:
# server-addr: 127.0.0.1:8848 # 配置中心地址
# file-extension: yaml # 配置檔案字尾 預設是context-path.字尾來查詢配置中心的檔案
# namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c # 開發環境
# group: XIAOAI_MICROSERVICE_GROUP # 業務組,可理解為那個專案
dubbo:
scan:
base-packages: com.xiaowei.service1.service
protocol:
name: dubbo
port: ${dubbo_port:20881}
registry:
address: nacos://127.0.0.1:8848
application:
qos-enable: false
consumer:
check: false
- 應用端
----應用端
package com.xiaowei.application.rest;
@RestController
@RequestMapping("/application1")
public class ApplicationController {
@org.apache.dubbo.config.annotation.Reference
private ConsumerService consumerService;
@GetMapping(value = "/service")
public String service(){
String target=consumerService.service();
return "application Invoke【應用端application-1】執行...呼叫【消費服務端】:\n"+target;
}
}
----配置檔案
server:
port: ${port:56020} #啟動埠 命令列注入
servlet:
context-path: /application1
spring:
application:
name: application1
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #
namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c
cluster-name: DEFAULT
# 連線配置中心配置對應配置檔案,通過配置中心可獲取專案相關配置,
# 該專案暫未有其他配置,只是先配置連線 即可不配置
# config:
# server-addr: 127.0.0.1:8848 # 配置中心地址
# file-extension: yaml # 配置檔案字尾 預設是context-path.字尾來查詢配置中心的檔案
# namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c # 開發環境
# group: XIAOAI_MICROSERVICE_GROUP # 業務組,可理解為那個專案----配置檔案
server:
port: ${port:56020} #啟動埠 命令列注入
servlet:
context-path: /application1
spring:
application:
name: application1
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #
namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c
cluster-name: DEFAULT
# 連線配置中心配置對應配置檔案,通過配置中心可獲取專案相關配置,
# 該專案暫未有其他配置,只是先配置連線 即可不配置
# config:
# server-addr: 127.0.0.1:8848 # 配置中心地址
# file-extension: yaml # 配置檔案字尾 預設是context-path.字尾來查詢配置中心的檔案
# namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c # 開發環境
# group: XIAOAI_MICROSERVICE_GROUP # 業務組,可理解為那個專案
以上即可通過dubbo實現正常服務呼叫了
可以加入閘道器服務,完成路由轉發。閘道器:將兩個使用不同協議的網路段連線bai在一起。可以看成將兩個不同專案的服務進行連線。
- zuul閘道器
----啟動器開啟閘道器代理
@SpringBootApplication
@EnableDiscoveryClient //開啟服務發現
@EnableZuulProxy // 開啟閘道器代理
public class ApiGatewayBootstrap {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayBootstrap.class,args);
}
}
----配置檔案
server:
port: 8000 #啟動埠 命令列注入
spring:
application:
name: api-gateway
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #
namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c
cluster-name: DEFAULT
# 由於需要用到配置中心的配置,因此需要配置nacos相關資訊
config:
server-addr: 127.0.0.1:8848 #
file-extension: yaml
namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c
group: XIAOAI_MICROSERVICE_GROUP
----配置中心配置檔案:application1.yml
zuul:
routes:
application1:
stripPreFix: false
path: /application1/** # 把以application1開頭的請求路徑都轉發到服務名為application1的應用中
- 測試
----訪問:http://localhost:56020/application1/application1/service
application Invoke【應用端application-1】執行...呼叫【消費服務端】:
Consumer Invoke【消費服務端service1-server】執行...呼叫【提供服務端】:
Provider Invoke【提供服務端service2-server】執行...
----訪問:http://localhost:8000/application1/application1/service
application Invoke【應用端application-1】執行...呼叫【消費服務端】:
Consumer Invoke【消費服務端service1-server】執行...呼叫【提供服務端】:
Provider Invoke【提供服務端service2-server】執行...


