天天看點

springcloud筆記九nacos一、環境安裝配置二、nacos服務提供者三、nacos服務消費者四、nacos作為注冊中心nacos叢集問題一:centos啟動nacos失敗問題二:啟動加載配置中心配置報錯

一、環境安裝配置

下載下傳位址:

https://github.com/alibaba/nacos/releases/tag/1.1.4
# 解壓
tar -zxvf nacos-server-1.4.1.tar.gz
           

單機啟動nacos

sh startup.sh -m standalone
           

nacos管理頁面

http://xxx:8848/nacos
           

二、nacos服務提供者

pom.xml

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
           

application.yaml

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.137.200:8848
management:
  endpoints:
    web:
      exposure:
        include: '*'
           

啟動類

添加@EnableDiscoveryClient

controller

package com.fox.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EchoController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/echo/{id}")
    public String echo(@PathVariable Long id) {
        return "Hello Nacos Discovery " + serverPort + ",id:" + id;
    }
}
           

三、nacos服務消費者

pom.xml

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>	
           

application.yaml

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.137.200:8848
# 消費者将要去通路的微服務名稱(注冊進nacos的微服務提供者
service-url:
  nacos-user-service: http://nacos-payment-provider
           

啟動類

添加@EnableDiscoveryClient

配置類注冊RestTemplate

package com.fox.springcloud.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
           

controller

package com.fox.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@Slf4j
public class OrderNacosController {
    @Resource
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serviceUrl;

    @GetMapping(value = "/consumer/echo/{id}")
    public String callEcho(@PathVariable Long id){
        return restTemplate.getForObject(serviceUrl + "/echo/" + id, String.class);
    }
}
           

四、nacos作為注冊中心

官方文檔:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

服務注冊中心對比

springcloud筆記九nacos一、環境安裝配置二、nacos服務提供者三、nacos服務消費者四、nacos作為注冊中心nacos叢集問題一:centos啟動nacos失敗問題二:啟動加載配置中心配置報錯
springcloud筆記九nacos一、環境安裝配置二、nacos服務提供者三、nacos服務消費者四、nacos作為注冊中心nacos叢集問題一:centos啟動nacos失敗問題二:啟動加載配置中心配置報錯

使用nacos作為注冊中心

pom.xml

<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.yaml

spring:
  profiles:
    active: dev
           

bootstrap.yaml

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.137.200:1111
        namespace: bcf9672b-31d0-43e1-8840-89974d05c4d0
      config:
        server-addr: 192.168.137.200:1111
        file-extension: yaml
        namespace: bcf9672b-31d0-43e1-8840-89974d05c4d0
        group: groupA
           

discovery.namespace服務注冊名稱空間

config.namespace注冊中心配置名稱空間

config.group注冊中心配置分組

啟動類

添加@EnableDiscoveryClient

controller

package com.fox.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RefreshScope
@RestController
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/payment/configInfo")
    public String configInfo(){
        return configInfo;
    }
}
           

Data ID命名規則

springcloud筆記九nacos一、環境安裝配置二、nacos服務提供者三、nacos服務消費者四、nacos作為注冊中心nacos叢集問題一:centos啟動nacos失敗問題二:啟動加載配置中心配置報錯
${spring.application.name}-{$spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
           

持久化

nacos增加了支援mysql資料源能力,具體的操作步驟:

  • 安裝資料庫,版本要求:5.6.5+
  • 初始化mysq資料庫,資料庫初始化檔案: conf/nacos-mysql.sql
  • 修改conf/application.properties檔案,增加支援mysql資料源配置(目前隻支援mysql),添加mysql資料源的url、使用者名和密碼。
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://ip:端口/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=roo
db.password=xxx
           

nacos叢集

服務架構

springcloud筆記九nacos一、環境安裝配置二、nacos服務提供者三、nacos服務消費者四、nacos作為注冊中心nacos叢集問題一:centos啟動nacos失敗問題二:啟動加載配置中心配置報錯

修改nacos startup.sh啟動腳本

springcloud筆記九nacos一、環境安裝配置二、nacos服務提供者三、nacos服務消費者四、nacos作為注冊中心nacos叢集問題一:centos啟動nacos失敗問題二:啟動加載配置中心配置報錯
springcloud筆記九nacos一、環境安裝配置二、nacos服務提供者三、nacos服務消費者四、nacos作為注冊中心nacos叢集問題一:centos啟動nacos失敗問題二:啟動加載配置中心配置報錯

修改後startup.sh

......
while getopts ":m:f:s:p:" opt
do
    case $opt in
        m)
            MODE=$OPTARG;;
        f)
            FUNCTION_MODE=$OPTARG;;
        s)
            SERVER=$OPTARG;;
        p)
            PORT=$OPTARG;;
        ?)
        echo "Unknown parameter"
        exit 1;;
    esac
done

......
# start
echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 &
nohup $JAVA -Dserver.port=${PORT} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out"
           

cluster.conf配置叢集

192.168.137.200:3333
192.168.137.201:3333
192.168.137.202:3333
           

啟動nacos

指定端口方式啟動nacos服務

nginx安裝配置

nginx安裝後預設路徑為/usr/local/nginx/

修改nginx.conf

......
upstream cluster{
        server 192.168.137.200:3333;
        server 192.168.137.201:3333;
        server 192.168.137.202:3333;
    }

    server {
        listen       1111;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://cluster;
        }
......
           

nginx指定配置檔案啟動

./nginx -c /usr/local/nginx/conf/nginx.conf
           

登入nacos管理頁面

http://192.168.137.200:1111/nacos
           

問題一:centos啟動nacos失敗

報錯資訊:

2021-06-22 16:25:23,437 ERROR read cluster conf fail

java.io.FileNotFoundException: /data/opt/nacos/conf/cluster.conf (沒有那個檔案或目錄)
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at com.alibaba.nacos.core.utils.SystemUtils.readClusterConf(SystemUtils.java:124)
	at com.alibaba.nacos.core.listener.StartingSpringApplicationRunListener.logClusterConf(StartingSpringApplicationRunListener.java:141)
	at com.alibaba.nacos.core.listener.StartingSpringApplicationRunListener.contextPrepared(StartingSpringApplicationRunListener.java:91)
	at org.springframework.boot.SpringApplicationRunListeners.contextPrepared(SpringApplicationRunListeners.java:60)
	at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:374)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
	at com.alibaba.nacos.Nacos.main(Nacos.java:33)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
	at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:593)
           

因為預設啟動的是叢集模式

使用單節點模式啟動
sh startup.sh -m standalone
           

問題二:啟動加載配置中心配置報錯

2021-08-11 07:14:05.727 ERROR 7880 --- [ac-01c5fa911e59] c.a.c.n.c.NacosPropertySourceBuilder     : parse data from Nacos error,dataId:nacos-config-client-dev.yaml,data:config:
  info: nacos config center,namespaces: gdgs, group:groupA,version=2,

org.yaml.snakeyaml.scanner.ScannerException: mapping values are not allowed here
 in 'reader', line 2, column 39:
     ... : nacos config center,namespaces: gdgs, group:groupA,version=2
           

報錯原因:配置資訊的value值中有冒号+空格,nacos解析鍵值對的時候會出錯,nacos配置頁面其實也用顔色提示了使用者

springcloud筆記九nacos一、環境安裝配置二、nacos服務提供者三、nacos服務消費者四、nacos作為注冊中心nacos叢集問題一:centos啟動nacos失敗問題二:啟動加載配置中心配置報錯

解決方案:字元串中有:的地方後面不要加空格