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


摘自:https://www.cnblogs.com/cicada-smile/p/12355994.html

源碼地址: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、通過業務、應用、技術、存儲方面,聊聊架構

 
分類:  Spring.Boot.Cloud


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM