SpringCloud大盤餐之Nacos
-
- 一、Spring Cloud介紹
- 二、Nacos搭建思路
-
- 一、實作步驟
- 二、安裝Nacos服務
- 三、內建Springboot、nacos
- 四、Nacos服務注冊與發現
- 五、OpenFeign、RestTemplate消費服務
- 三、參考項目源碼
一、Spring Cloud介紹
Spring Cloud是一系列架構的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、資料監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring Cloud并沒有重複制造輪子,它隻是将目前各家公司開發的比較成熟、經得起實際考驗的服務架構組合起來,通過Spring Boot風格進行再封裝屏蔽掉了複雜的配置和實作原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。
二、Nacos搭建思路
一、實作步驟
- 準備環境(windows、linux)、安裝nacos
- 內建Springboot、nacos
- Nacos服務注冊與發現
- Nacos內建OpenFeign、RestTemplate消費
- Nacos配置中心
二、安裝Nacos服務
本次使用Nacos版本為1.4.0
下載下傳位址:https://github.com/alibaba/nacos/releases/tag/1.4.0
點選“nacos-server-1.4.0.tar.gz”下載下傳,并傳到linux的/usr/local/nacos目錄下。
#解壓縮安裝包
tar -xzvf nacos-server-1.4.0.tar.gz
#進入到bin目錄下
cd /usr/local/nacos/bin/
#啟動nacos,這裡暫時以單機方式啟動,後面有機會再走叢集
sh startup.sh -m standalone
通路 http://你的伺服器ip:8848/nacos 會進入到nacos管理平台
預設賬号:nacos
預設密碼:nacos
三、內建Springboot、nacos
通過idea建立SpringBoot項目後,父級pom配置
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.11.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cloud</groupId>
<artifactId>cloud-demo</artifactId>
<version>1.0</version>
<name>cloud-demo</name>
<packaging>pom</packaging>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring.cloud-version>Hoxton.SR5</spring.cloud-version>
</properties>
<modules>
<module>producer</module>
</modules>
<dependencyManagement>
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- springcloud alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.0.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- springBoot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<!-- json -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
</dependencies>
</project>
字子產品pom.xml
<parent>
<groupId>com.cloud</groupId>
<artifactId>cloud-demo</artifactId>
<version>1.0</version>
</parent>
<groupId>com.cloud</groupId>
<artifactId>producer</artifactId>
<version>1.0</version>
<name>producer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
四、Nacos服務注冊與發現
以上maven依賴引用完成,下面看yml:
server:
port: 8001
spring:
application:
name: producer #注冊的服務應用名
cloud:
nacos:
discovery:
server-addr: xx.xx.xxx.xx:8848 #代表你的nacos伺服器和nacos服務端口
下面看代碼:
@RestController
@RequestMapping("/producer")
public class ProducerController {
/**
* post形式的方法
* @param name
* @return
*/
@PostMapping("/postDetail")
public String postDetail(@RequestParam String name){
return "postDetail方法入參:"+name;
}
/**
* get形式的方法
* @param name
* @return
*/
@GetMapping("/getDetail")
public String getDetail(@RequestParam String name){
return "getDetail方法入參:"+name;
}
}
啟動類:
@SpringBootApplication(scanBasePackages = "com.cloud")
@EnableDiscoveryClient
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class, args);
}
}
運作ProducerApplication.java後,傳回Nacos平台檢視:
自己的服務已經注冊進來。
五、OpenFeign、RestTemplate消費服務
子子產品pom.xml
<parent>
<groupId>com.cloud</groupId>
<artifactId>cloud-demo</artifactId>
<version>1.0</version>
</parent>
<groupId>com.cloud</groupId>
<artifactId>consumer</artifactId>
<version>1.0</version>
<name>consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- openFeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
yml配置檔案
server:
port: 8002
spring:
application:
name: consumer #應用名
cloud:
nacos:
discovery:
server-addr: xx.xx.xxx.xx:8848 #nacos服務位址和端口
1. OpenFeign形式消費服務
下面看openFeign的代碼:
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* @Author wangy
* @create 2021/6/16 10:20
* @Description RPC方式調用
*/
@FeignClient(name = "producer")
public interface IProducerService {
/**
* post形式的方法 調用接口跟直接調用方法一樣便利無感覺
* @param name
* @return
*/
@PostMapping("/producer/postDetail")
public String postDetail(@RequestParam String name);
/**
* get形式的方法 調用接口跟直接調用方法一樣便利無感覺
* @param name
* @return
*/
@GetMapping("/producer/getDetail")
public String getDetail(@RequestParam String name);
}
Controller代碼:
@RestController
@RequestMapping("/openFeignConsumer")
public class OpenFeignConsumerController {
@Autowired
private IProducerService producerService;
/**
* openFeign形式調用 producer接口
* @param name
* @return
*/
@PostMapping("/postDetail")
public String postDetail(@RequestParam String name){
return producerService.postDetail(name);
}
/**
* openFeign形式調用 producer接口
* @param name
* @return
*/
@GetMapping("/getDetail")
public String getDetail(@RequestParam String name){
return producerService.getDetail(name);
}
}
啟動類:
@SpringBootApplication(scanBasePackages = "com.cloud")
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.cloud.consumer.service")
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
上面注意,使用OpenFeign的話,一定要注意掃描包路徑要配置上
@EnableFeignClients(basePackages = “com.cloud.consumer.service”)
不加則會找不到注入的類
通過OpenFeign方式調用接口,跟直接調用方法一樣便利,高效。
2. RestTemplate形式消費服務
首先建立配置類:
@Configuration
public class RestTemplateConfiguration {
/**
* 使restTemplate具有負載均衡作用
* @return
*/
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
然後Controller類調用接口:
/**
* @Author wangy
* @create 2021/6/15 9:56
* @Description openFeign形式調用 producer接口
*/
@RestController
@RequestMapping("/restTemplateConsumer")
public class RestTemplateConsumerController {
@Autowired
private RestTemplate restTemplate;
/**
* restTemplate形式調用 producer接口和傳值
* @param name
* @return
*/
@PostMapping("/postDetail")
public String postDetail(@RequestParam String name){
//post形式必須用MultiValueMap接口實作類來傳值
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();
//map的put的值是list
paramMap.put("name", Arrays.asList(name));
//url解析: producer為服務提供者的application.name 後面跟接口請求路徑
return restTemplate.postForObject("http://producer/producer/postDetail", paramMap, String.class);
}
/**
* restTemplate形式調用 producer接口和傳值
* @param name
* @return
*/
@GetMapping("/getDetail")
public String getDetail(@RequestParam String name){
//get方法使用map來傳值,url中使用占位符來跟map的key想對應
Map map = new HashMap();
map.put("name",name);
//url解析: producer為服務提供者的application.name 後面跟接口請求路徑
return restTemplate.getForObject("http://producer/producer/getDetail?name={name}", String.class, map);
}
}
三、參考項目源碼
目前項目源碼位址:
https://gitee.com/wangyue123com_admin/cloud-demo.git
分支為:Nacos-discovery