Nacos微服務配置踩坑,註冊&發現快速上手
阿新 • • 發佈:2019-12-31
快速搭建一個單機的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
複製程式碼