天天看點

分布式體驗

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】執行...

           
分布式體驗
分布式體驗