使用Springboot+Nacos搭建微服務架構以及微服務之間調用

目錄

1、首先需要搭建Nacos-server

nacos搭建環境要求

nacos-server下載方式

nacos-server啓動

2.搭建服務註冊發現和nacos-config配置中心

服務註冊發現

config配置中心

3、微服務調用


需求:業務量升級,老大要求使用nacos微服務架構,技研玩了一下,從搭建到使用一整套流程


1、首先需要搭建Nacos-server

nacos搭建環境要求,如下:

  1. 64位操作系統,支持 Linux/Unix/Mac/Windows
  2. 64 位 JDK 1.8+
  3. Maven 3.2.x+
  4. 目前Spring Boot需要 2.2.0.RELEASE---2.3.0.M1之間的版本 支持nacos

環境變量Java_home,maven_home自行配置,筆者就不在此處贅述

nacos-server下載方式

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/

// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

 筆者當前用的 nacos-server-1.2.1.tar.gz 這個版本,release 1.3.0 beta還處於beta版本且下載很慢,推薦使用nacos-server-1.2.1.tar.gz (linux) 或者 nacos-server-1.2.1.zip(windows)版本

nacos-server啓動

linux啓動命令:sh startup.sh -m standalone

windos啓動命令:startup.cmd 

默認的登錄名nacos 密碼 nacos,登錄後UI頁面如下,還是挺帶勁的

如果想修改端口號和context,可以在nacos\distribution\conf目錄下找到application.properties文件修改

server.servlet.contextPath=/nacos
### Default web server port:
server.port=8848 

如果想修改登錄名和密碼,可以在同目錄下的application.properties.example文件進行修改

而且nacos是支持mysql和adb進行數據持久化的


2.搭建服務註冊發現和nacos-config配置中心

服務註冊發現

provider的pom依賴:

<properties>
   <java.version>1.8</java.version>
   <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
   <dependencies>
      <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-alibaba-dependencies</artifactId>
         <version>${spring-cloud-alibaba.version}</version>
         <type>pom</type>
         <scope>import</scope>
      </dependency>
   </dependencies>
</dependencyManagement>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

application.properties配置信息:

## 服務提供者server provider
server.port=8070
spring.application.name=service-provider
##nacos註冊中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#允許其他服務通過註冊中心發現該服務#
eureka.instance.prefer-ip-address= true

在啓動類上添加註解 @EnableDiscoveryClient,就會向nacos-server註冊服務
@SpringBootApplication
@EnableDiscoveryClient
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }

}

至此生產者provider就此搭建起來了

consumer的pom依賴:

<properties>
   <java.version>1.8</java.version>
   <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
   <dependencies>
      <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-alibaba-dependencies</artifactId>
         <version>${spring-cloud-alibaba.version}</version>
         <type>pom</type>
         <scope>import</scope>
      </dependency>
   </dependencies>
</dependencyManagement>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>

同provider的依賴是一樣一樣的

application.properties配置信息:

server.port=8111
spring.application.name=service-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
在啓動類上添加註解 @EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerStartApplication {
   public static void main(String[] args) {
      SpringApplication.run(ConsumerStartApplication.class, args);
   }
}

啓動起來了,success!!! 如下

config配置中心

config的pom依賴:

<properties>
   <java.version>1.8</java.version>
   <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
   <dependencies>
      <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-alibaba-dependencies</artifactId>
         <version>${spring-cloud-alibaba.version}</version>
         <type>pom</type>
         <scope>import</scope>
      </dependency>
   </dependencies>
</dependencyManagement>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
   <version>0.2.1.RELEASE</version>
</dependency>

properties配置文件分優先級bootstrap.properties最高,項目啓動就要向nacos-server拉取配置數據

bootstrap.properties配置內容

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=nacos-config
spring.cloud.nacos.config.file-extension=properties
management.endpoints.web.exposure.include=*

application.properties配置內容:

spring.profiles.active=dev
server.port=8100

配置中心需要自己寫一個讀取配置類,

這個類可以從配置中心讀取已經配置的屬性,@RefreshScope支持動態讀取,配置中心更改配置信息後,可以通過這個註解自動刷新,然後通過/actuator/refresh刷新後即可獲取(適合節點較少),如果集羣節點太多,可以引入spring-cloud-bus服務總線,進行集羣同步,通過/actuator/bus_refresh 即可將所有節點同步,就不用重啓服務器了,否則運維會拿着10米長大砍刀來砍死你

@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${useLocalCache}")
    private String useLocalCache;

    @RequestMapping("/get")
    public String get() {
        return useLocalCache;
    }
}

啓動類:

@SpringBootApplication
public class NacosConfigApplication {
   public static void main(String[] args) {
      SpringApplication.run(NacosConfigApplication.class, args);
   }
}

try一下:在配置中心配置下

 

接口讀取一下:

在nacos-server配置中心更改下,不重啓服務

調用/actuator/refresh自動刷新

返回值,他會給你哪些key發生了變化,真好!這個可以支持我們局部更新配置屬性,不用全量更新了

然後調一下配置讀取接口

配置中心的demo over...


3、微服務調用

在這裏筆者演示RestTemplate和OpenFeign兩種方式

使用RestTemplate進行遠程請求

需要初始化restTemplate模板 @LoadBalanced實現了ribbon負載均衡

@Configuration
@Slf4j
public class BeanConfig {

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate(){
        log.info("初始化restTemplate模板...");
        return new RestTemplate();
    }
}
使用demo,需要配置url,入參,返回類型,當然這個需要自己設定好,或者和他人配合約定好
@RestController
@RequestMapping(value = "/service-inlet")
public class NacosConsumerController {
    @Autowired
    private RestTemplate restTemplate;
    private static final String URL_PREFIX="http://service-provider";

    @RequestMapping("/getList")
    public List<String> getList(){
       return this.restTemplate.postForObject(URL_PREFIX+"/getUserList",null,List.class);
    }
}

然後在服務提供方provider寫一個對應的服務接口

@RestController
@Slf4j
public class NacosProviderController {

    @RequestMapping(value="/getUserList")
    public List<String> getUserList(){
        log.info("開始調用start");
        List<String> result=new ArrayList<>();
        result.add("test1");
        result.add("test2");
        result.add("test3");
        result.add("test4");
        result.add("test5");
        result.add("test6");
        log.info("調用end");
        return  result;
    }
}

然後啓動服務提供者和服務消費者,看效果

可以,序列化他已經幫你做了!!

使用OpenFeign進行遠程請求

需要在上面的consumer上面增加feign依賴

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
   <version>2.2.3.RELEASE</version>
</dependency>

消費者調用使用FeignClient,需要做的就是自己要寫一下接口,比RestTemplate工作量要稍微大一點,但是更服務Java的架構思想,各有優劣點,自行選擇

@RestController
@RequestMapping(value = "/service-inlet")
public class NacosConsumerController {
    
    @Autowired
    private UserApi UserApi;

    @RequestMapping("/getFeignList")
    public List<String> getFeignList(){
        return this.UserApi.getFeignList();
    }
}

Feign的方式額外多寫個 UserApi 類,FeignClient註解就是表明這個類都要發http請求,value是註冊中心的服務提供方的application-name

@FeignClient(value="service-provider")
public interface UserApi {

    @RequestMapping(value = "/getUserList",method = RequestMethod.POST)
    List<String> getFeignList();
}
最後在啓動類上添加@EnableFeignClients,標註這是一個Feign客戶端

@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerStartApplication {
   public static void main(String[] args) {
      SpringApplication.run(ConsumerStartApplication.class, args);
   }
}

啓動後,再調用接口查看下使用Feign的效果

也好使!!

兩者的優缺點:

RestTemplate:優點-->代碼不用冗餘寫中間接口,易讀,缺點--> 代碼不優雅,還需要寫url
Feign:優點-->代碼優雅,一如既往的像之前的那種service和serviceImpl(此時在provider工程裏實現的)缺點-->需要額外寫中間接口

至此對nacos的技術預研告一段落,相比netflix的那一套eureka,config而言,nacos做的更加集成化,輕量級,而且完全國產化,是阿里巴巴自研微服務框架技術,更重要的和阿里內部的其他消息中間件rocketMq,更加友好,而且最近adb出了mysql版本,叫ads,後期應該也會有更好的融合!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章