1. 程式人生 > >SpringCloud微服務:阿里開源元件Nacos,服務和配置管理

SpringCloud微服務:阿里開源元件Nacos,服務和配置管理

原始碼地址:GitHub·點這裡||GitEE·點這裡

一、阿里微服務簡介

1、基礎描述

Alibaba-Cloud致力於提供微服務開發的一站式解決方案。此專案包含開發分散式應用微服務的必需元件,方便開發者通過SpringCloud程式設計模型輕鬆使用這些元件來開發分散式應用服務。只需要新增一些註解和少量配置,就可以將SpringCloud應用接入阿里微服務解決方案,通過阿里中介軟體來迅速搭建分散式應用系統。

2、核心功能

  • 服務限流降級

預設支援 WebServlet、WebFlux, OpenFeign、RestTemplate、SpringCloudGateway,Zuul,Dubbo和RocketMQ限流降級功能的接入,可以在執行時通過控制檯實時修改限流降級規則,還支援檢視限流降級 Metrics 監控。

  • 服務註冊與發現

適配 Spring Cloud 服務註冊與發現標準,預設集成了 Ribbon 的支援。

  • 分散式配置管理

支援分散式系統中的外部化配置,配置更改時自動重新整理。

  • 訊息驅動能力

基於 Spring Cloud Stream 為微服務應用構建訊息驅動能力。

  • 分散式事務

使用 @GlobalTransactional 註解, 高效並且對業務零侵入地解決分散式事務問題。

  • 分散式任務排程

提供秒級、精準、高可靠、高可用的定時(基於Cron表示式)任務排程服務。同時提供分散式的任務執行模型,如網格任務。網格任務支援海量子任務均勻分配到所有 Worker(schedulerx-client)上執行。

3、功能元件

  • Nacos

一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。

  • Sentinel

把流量作為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。

  • RocketMQ

一款開源的分散式訊息系統,基於高可用分散式叢集技術,提供低延時的、高可靠的訊息釋出與訂閱服務。

  • Dubbo

Apache Dubbo 是一款高效能 Java RPC 框架。

  • Seata

阿里巴巴開源產品,一個易於使用的高效能微服務分散式事務解決方案。

  • OSS

阿里雲物件儲存服務(Object StorageService,簡稱OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲端儲存服務。您可以在任何應用、任何時間、任何地點儲存和訪問任意型別的資料。

  • SchedulerX

阿里中介軟體團隊開發的一款分散式任務排程產品,提供秒級、精準、高可靠、高可用的定時(基於 Cron 表示式)任務排程服務。

4、環境和依賴

  • Nacos服務

Nacos 致力於發現、配置和管理微服務。幫助開發者快速實現動態服務發現、服務配置、服務元資料及流量管理。敏捷構建、交付和管理微服務平臺。首先下載 Nacos 並啟動 Nacos server。

參考文章:Nacos元件,環境搭建和入門案例詳解

  • 版本關係

版本 2.1.x.RELEASE 對應的是 SpringBoot2.1.x版本。版本2.0.x.RELEASE對應的是SpringBoot2.0.x版本。PS通常學習新的東西,最容易讓人犯迷糊的地方就是版本對應關係,問題不好排查,一般都可以參考官網的給的樣例。

二、服務中心管理

1、案例結構

  • 服務端:node08-nacos-server
  • 客戶端:node08-nacos-clien

2、配置檔案

配置內容如下:

my:
  name: cloud
  info: alibaba
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/data_one
      username: root
      password: 123

核心內容:DataID、檔案格式、檔案內容的配置。這裡還配置了一個MySQL資料來源。

3、服務註冊發現

(1)、服務端配置

  • 核心依賴
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>
  • 配置檔案
spring:
  application:
    name: node08-nacos-server
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

這裡的name配置和上面DataID一致,就可以讀取上述配置內容。

  • 提供服務介面
@RestController
public class ServerWeb {
    private static Logger logger = LoggerFactory.getLogger(ServerWeb.class) ;
    @RequestMapping(value = "/web/getMsg",method = RequestMethod.GET)
    public String getMsg (@RequestParam("name") String name){
        logger.info("8001 服務被呼叫...");
        return "Hello:" + name ;
    }
}
  • 啟動類註解
@SpringBootApplication
// SpringCloud原生註解@EnableDiscoveryClient開啟服務註冊發現功能
@EnableDiscoveryClient
public class ApplicationServer {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationServer.class,args) ;
    }
}

(2)、客戶端配置

  • 核心依賴
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>
<!-- Feign元件 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>

這裡也可以基於Feign模式,訪問上述服務端提供的介面服務 。

  • 基於Rest介面訪問

提供介面配置

@Configuration
public class RestConfig {
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

這裡用法和SpringCloud原生框架生態相同 。

請求方法

@RestController
public class ClientWeb {
    @Resource
    private RestTemplate restTemplate ;
    @RequestMapping(value = "/web/getMsgV1/{name}",method = RequestMethod.GET)
    public String getMsgV1 (@PathVariable String name){
        String reqUrl = "http://node08-nacos-server:8001/web/getMsg/"+name ;
        return restTemplate.getForObject(reqUrl,String.class) ;
    }
}
  • 基於Feign介面訪問

Feign介面配置

@FeignClient("node08-nacos-server")
public interface MsgFeign {
    @GetMapping("/web/getMsg")
    String getMsg (@RequestParam(name = "name") String name);
}

這裡用法依舊和SpringCloud原生框架生態相同 。

請求方法

@RestController
public class ClientWeb {
    @Resource
    private MsgFeign msgFeign ;

    @RequestMapping(value = "/web/getMsgV2/{name}",method = RequestMethod.GET)
    public String getMsgV2 (@PathVariable String name){
        return msgFeign.getMsg(name) ;
    }
}
  • 啟動類配置
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages={"cloud.nacos.client.feign"})
public class ApplicationClient {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationClient.class,args) ;
    }
}

三、配置中心管理

通過Nacos的配置管理可以將整合架構體系內配置,集中統一在Nacos中儲存管理。分離的多環境配置,靈活的許可權管理。

1、核心依賴

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

2、服務端配置

spring:
  application:
    name: node08-nacos-server
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml

這裡的核心配置是config配置。

3、配置讀取方式

這裡就是Spring框架原生的讀取方式。

@RestController
@RefreshScope
public class ValueWeb {

    @Value("${my.name:}")
    private String myName ;

    @Value("${my.info:}")
    private String myInfo ;

    @RequestMapping("/getNameInfo")
    public String getNameInfo (){
        return myName+":"+myInfo ;
    }
}

4、資料庫連線

配置JDBC連線

這裡基於Druid連線池,配置JdbcTemplate資料庫訪問API。

@Configuration
public class DruidConfig {

    @Value("${spring.datasource.druid.url}")
    private String dbUrl;
    @Value("${spring.datasource.druid.username}")
    private String username;
    @Value("${spring.datasource.druid.password}")
    private String password;
    @Value("${spring.datasource.druid.driverClassName}")
    private String driverClassName;

    /**
     * Druid 連線池配置
     */
    @Bean
    public DruidDataSource dataSource() {
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        return datasource;
    }
    /**
     * JDBC操作配置
     */
    @Bean(name = "jdbcTemplate")
    public JdbcTemplate jdbcTemplate (@Autowired DruidDataSource dataSource){
        return new JdbcTemplate(dataSource) ;
    }
}

測試方法

@RestController
public class JdbcWeb {
    @Resource
    private JdbcTemplate jdbcTemplate ;
    @RequestMapping("/getJdbc")
    public List<String> getJdbc (){
        String sql = "select phone from d_phone" ;
        List<String> phoneEntityList = jdbcTemplate.queryForList(sql,String.class) ;
        return phoneEntityList ;
    }
}

四、案例總結

上面兩個使用案例走下來,感覺和原生SpringCloud的用法區別不大,整體上手難度也不太高,畢竟AlibabaCloud框架是在SpringCloud框架基礎上。適配了阿里很多開源元件,在微服務框架元件選擇上,根據業務需求和團隊的熟悉程式選擇即可。

五、原始碼地址

GitHub地址:知了一笑
https://github.com/cicadasmile/spring-cloud-base
GitEE地址:知了一笑
https://gitee.com/cicadasmile/spring-cloud-base

推薦閱讀:微服務架構

《1、專案技術選型簡介,架構圖解說明》

《2、業務架構設計,系統分層管理》

《3、資料庫選型簡介,業務資料規劃設計》

《4、中介軟體整合,公共服務封裝》

《5、SpringCloud 基礎元件應用設計》

《6、通過業務、應用、技術、儲存方面,聊聊架構