1. 程式人生 >實用技巧 >其它 >分散式體驗

分散式體驗


技術標籤: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】執行...

分散式體驗

分散式體驗