1. 程式人生 > 程式設計 >Nacos微服務配置踩坑,註冊&發現快速上手

Nacos微服務配置踩坑,註冊&發現快速上手

快速搭建一個單機的Nacos

準備好centos7,配好JAVA_HOME, Nacos下載地址

tar xf nacos-server-1.1.4.tar.gz -C {指定解壓目錄}
cd {解壓目錄}
#修改持久層為mysql(預設是用derby)
#將 conf/nacos-mysql.sql懟到你的資料庫
vi conf/application.properties
#新增以下內容,具體內容根據自己的環境定,比如資料,使用者和密碼
# spring.datasource.platform=mysql  
# db.num=1  
# db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true  
# db.user=nacos_devtest # db.password=youdontknow #啟動單節點 sh startup.sh -m standalone #入口地址 #http://{本機ip}/nacos/index.html#/login #預設使用者名稱/密碼為 nacos/nacos 複製程式碼

nacos可以做為配置中心(同類產品有apollo,springcloud config),註冊中心(同型別eureka,consul,zookeeper)。
nacos可以做高可用,叢集,具體怎麼搭,請參考官網檔案。

SpringBoot2.X整合Nacos的配置中心

依賴

第一種:使用springboot客戶端。
Maven Pom

 <properties>
        <nacos-config-spring-boot.version>0.2.1</nacos-config-spring-boot.version>
    </properties>


    <dependencies>
        <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>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-starter</artifactId> <version>${nacos-config-spring-boot.version}</version> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-actuator</artifactId> <version>${nacos-config-spring-boot.version}</version> </dependency> </dependencies> 複製程式碼

本地properties配置

nacos.config.server-addr=地址:8848
複製程式碼

建立Nacos配置

Springboot 注入

@SpringBootApplication
@NacosPropertySource(dataId = "first_data",groupId = "first_group",autoRefreshed = true)
@RestController
public class NacosApplication {
    @NacosValue(value = "${test.mytest:defaultString}",autoRefreshed = true)
    private String test;

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

    @GetMapping("/get")
    public JsonNode get() {
        ObjectNode jsonNodes = JsonNodeFactory.instance.objectNode();
        jsonNodes.put("testStringIs",test);
        return jsonNodes;
    }
}
複製程式碼

第二種:使用com.alibaba.cloud

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>
複製程式碼

另外你的父pom

 <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
複製程式碼

不過com.alibaba.cloud整合springboot我自己整合的時候,是失敗的,nacos客戶端根本沒有發http請求去拿配置資料,也就無法注入springboot容器。

第三種:用spirng-cloud封裝好的starter

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>0.9.0.RELEASE</version>
</dependency>
複製程式碼
spring.cloud.nacos.config.server-addr=192.168.208.102:8848
spring.application.name=first_data
spring.cloud.nacos.config.group=first_group
spring.cloud.nacos.config.file-extension=properties
複製程式碼

這個starter是有坑的,比如我拿之前first_data / first_group,他發http請求會發到http://192.168.208.102:8848/nacos/v1/cs/configs?dataId=first_data.properties&group=first_group,但是這個地址是拿不到的,需要去除掉first_data字尾properties才能拿到資料的,不知道是spring封裝的有問題還是。抓包詳情如下圖(haha是已存在的一個dataid)。

# 抓包工具Mitmproxy
#java 引數指定 
-DproxyHost=127.0.0.1 -DproxyPort=8080
複製程式碼

Springboot服務註冊

父工程pom

 <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                    <version>0.9.0.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>com.alibaba.nacos</groupId>
                    <artifactId>nacos-client</artifactId>
                    <version>1.1.0</version>
                </dependency>
            </dependencies>
    </dependencyManagement>
複製程式碼

子專案pom

 <properties>
        <nacos-discovery-spring-boot.version>0.2.1</nacos-discovery-spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.nacos</groupId>
                    <artifactId>nacos-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.1.0.Final</version>
        </dependency>
    </dependencies>
複製程式碼

Springboot啟動類

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

    @RestController
    class EchoController {
        @RequestMapping(value = "/echo/{string}",method = RequestMethod.GET)
        public String echo(@PathVariable String string) {
            return "Hello Nacos Discovery " + string;
        }
    }


}
複製程式碼

application.properties

server.port=8100
spring.application.name=nacos-provider
spring.cloud.nacos.discovery.server-addr=192.168.208.102:8848
複製程式碼

服務發現於呼叫

pom

<properties>
        <spring-cloud-openfeign.version>2.0.0.RELEASE</spring-cloud-openfeign.version>
        <spring-cloud-netflix.version>2.0.0.RELEASE</spring-cloud-netflix.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            <version>${spring-cloud-netflix.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>${spring-cloud-openfeign.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.nacos</groupId>
                    <artifactId>nacos-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>
    </dependencies>
複製程式碼

啟動類

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

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

    @RestController
    public class TestController {

        private final RestTemplate restTemplate;

        @Autowired
        public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}

        @RequestMapping(value = "/echo/{str}",method = RequestMethod.GET)
        public String echo(@PathVariable String str) {
            return restTemplate.getForObject("http://nacos-provider/echo/" + str,String.class);
        }
    }
}
複製程式碼

application.properties

server.port=8200
spring.application.name=service-consumer
spring.cloud.nacos.discovery.server-addr=192.168.208.102:8848
複製程式碼

Feign客戶端整合

pom

 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>



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

    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
複製程式碼

宣告Feign

@FeignClient("nacos-provider")
public interface Consumer {
    @RequestMapping(value = "/echo/{string}",method = RequestMethod.GET)
    public String echo(@PathVariable String string);
}
複製程式碼

Ctroller整合Feign

@RestController
public class FeignCtl {
    @Autowired
    Consumer consumer;
    @GetMapping("/hello")
    public String hello(@RequestParam String echoStr){
        return consumer.echo(echoStr);
    }
}
複製程式碼

Feign整合Sentinel,服務熔斷

   <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
複製程式碼

Springboot配置

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.208.102:8848
feign:
  sentinel:
    enabled: true
複製程式碼

宣告feign時候指定熔斷服務類

@FeignClient(value = "nacos-provider",fallback = EchoServiceFallback.class)
public interface Consumer {
    @RequestMapping(value = "/echo/{string}",method = RequestMethod.GET)
    public String echo(@PathVariable String string);
}

複製程式碼

熔斷服務類

@Component
public class EchoServiceFallback  implements Consumer {
    @Override
    public String echo(String string) {
        return "服務熔斷,請稍微重試";
    }
}
複製程式碼

服務熔斷監控

#官方release地址
https://github.com/alibaba/Sentinel.git
複製程式碼
spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8080
複製程式碼

專案github

github.com/maodunWorld…