Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。html
Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以「服務」爲中心的現代應用架構 (例如微服務範式、雲原生範式) 的服務基礎設施。java
官方介紹文檔:Nacos 快速開始或者直接下載zip包,部署下載git
必定要注意,jdk版本要求 64bit JDK 1.8+github
運行startup.cmd,一閃而過。打開startup.cmd腳本,在最後一行添加 pause 使報錯不會當即結束方便查看報錯信息,這時會發現如下報錯信息:web
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/springfra mework/boot/loader/PropertiesLauncher : Unsupported major.minor version 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:800) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14 2) at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
產生以上問題的緣由是我電腦上有些老項目使用jdk 1.7,因此項目是jdk1.7和jdk1.8交叉着使用。在cmd裏查看版本 java -version 輸出而後是1.8.0_211(只會輸出最高的版本)spring
C:\Users\Administrator>set java_home JAVA_HOME=D:\Program Files\Java\jdk1.7.0_71 C:\Users\Administrator>set java8_home JAVA8_HOME=D:\Program Files\Java\jdk1.8.0_201 C:\Users\Administrator>
if not exist "%JAVA8_HOME%\bin\java.exe" echo Please set the JAVA8_HOME variable in your environment, We need java(x64)! jdk8 or later is better! & EXIT /B 1 set "JAVA=%JAVA8_HOME%\bin\java.exe"
這裏只作個替換,把原來的JAVA_HOME規劃成JAVA8_HOME,運行startup.cmd,此時能正確運行Nacos服務了json
啓動成功,在瀏覽器上訪問:http://localhost:8848/nacos ,會跳轉到登錄界面,默認的登錄用戶名爲nacos,密碼也爲nacos。windows
登錄成功後,就能夠操做管理界面了瀏覽器
要使用nacos,須要在pom.xml添加必要的依賴架構
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <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>
在本案例中,使用3個服務註冊到Nacos上,分別爲服務提供者ali-nacos-provider和負載均衡ribbon消費者ali-nacos-consumer-ribbon、申明式服務調用feign消費者ali-nacos-consumer-feign。
什麼是ribbon和feign,及使用示例這裏不重複介紹,須要瞭解能夠查看示例
pom.xml添加nacos依賴
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
application.yml配置
server: port: 9000 #指定爲9000端口 spring: application: name: ali-nacos-provider #服務名 cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #服務註冊地址(nacos默認爲8848端口) management: endpoints: web: exposure: include: '*'
啓動類增長 @EnableDiscoveryClient 註解
package com.easy.aliNacosProvider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class AliNacosProviderApplication { public static void main(String[] args) { SpringApplication.run(AliNacosProviderApplication.class, args); } }
寫個hello服務接口 HelloController.java
package com.easy.aliNacosProvider; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController @Slf4j public class HelloController { @GetMapping(value = "/hello/{str}", produces = "application/json") public String hello(@PathVariable String str) { log.info("-----------收到消費者請求-----------"); log.info("收到消費者傳遞的參數:" + str); String result = "我是服務提供者,見到你很高興==>" + str; log.info("提供者返回結果:" + result); return result; } }
pom.xml增長nocos和ribbon依賴
<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.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> </dependencies>
application.yml
server: port: 9100 spring: application: name: ali-nacos-consumer-ribbon cloud: nacos: discovery: server-addr: 127.0.0.1:8848
服務調用HomeController.java
package com.easy.ancRibbon; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController @Slf4j public class HomeController { @Autowired private RestTemplate restTemplate; @GetMapping(value = "/", produces = "application/json") public String home() { log.info("-----------------consumer調用開始-----------------"); String param = "雲天"; log.info("消費者傳遞參數:" + param); String result = restTemplate.getForObject("http://ali-nacos-provider/hello/" + param, String.class); log.info("收到提供者響應:" + result); return "ribbon消費者," + result; } }
啓用類AncRibbonConsumerApplication.java
package com.easy.ancRibbon; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient public class AncRibbonConsumerApplication { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(AncRibbonConsumerApplication.class, args); } }
pom.xml
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <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-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
application.yml
server: port: 9101 spring: application: name: ali-nacos-consumer-feign cloud: nacos: discovery: server-addr: 127.0.0.1:8848 main: allow-bean-definition-overriding: true #容許同樣的beanName
這裏有個坑要注意下,若是allow-bean-definition-overriding爲設置爲true,運行會報以下錯:
錯誤: Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
這裏有問題的詳細介紹問題緣由
申請服務HelloService.java
package com.easy.ancFeign; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @FeignClient("ali-nacos-provider") public interface HelloService { @RequestMapping(path = "hello/{str}") String hello(@RequestParam("str") String param); }
服務調用HomeController.java
package com.easy.ancFeign; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @Slf4j public class HomeController { @Autowired private HelloService helloService; @GetMapping(value = "/", produces = "application/json") public String home() { log.info("-----------------consumer調用開始-----------------"); String param = "雲天"; log.info("消費者傳遞參數:" + param); String result = helloService.hello(param); log.info("收到提供者響應:" + result); return "feign消費者" + result; } }
啓動類AncFeignConsumerApplication.java
package com.easy.ancFeign; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableFeignClients(basePackages = {"com.easy.ancFeign"}) public class AncFeignConsumerApplication { public static void main(String[] args) { SpringApplication.run(AncFeignConsumerApplication.class, args); } }
ali-nacos-provider:服務提供者1,服務名:ali-nacos-provider,端口:9000
ali-nacos-consumer-ribbon:ribbon服務消費者,服務名:ali-nacos-consumer-ribbon,端口:9100
ali-nacos-consumer-feign:feign消費者,服務名:ali-nacos-consumer-feign,端口:9101
首先要啓動服務註冊中心 nacos
其次,分別啓動ali-nacos-provider、ali-nacos-consumer-ribbon、ali-nacos-consumer-feign三個服務