天天看點

一、SpringCloud架構搭建之Nacos服務注冊與發現

SpringCloud大盤餐之Nacos

    • 一、Spring Cloud介紹
    • 二、Nacos搭建思路
      • 一、實作步驟
      • 二、安裝Nacos服務
      • 三、內建Springboot、nacos
      • 四、Nacos服務注冊與發現
      • 五、OpenFeign、RestTemplate消費服務
    • 三、參考項目源碼

一、Spring Cloud介紹

Spring Cloud是一系列架構的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、資料監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring Cloud并沒有重複制造輪子,它隻是将目前各家公司開發的比較成熟、經得起實際考驗的服務架構組合起來,通過Spring Boot風格進行再封裝屏蔽掉了複雜的配置和實作原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。

二、Nacos搭建思路

一、實作步驟

  1. 準備環境(windows、linux)、安裝nacos
  2. 內建Springboot、nacos
  3. Nacos服務注冊與發現
  4. Nacos內建OpenFeign、RestTemplate消費
  5. Nacos配置中心

二、安裝Nacos服務

本次使用Nacos版本為1.4.0

下載下傳位址:https://github.com/alibaba/nacos/releases/tag/1.4.0

一、SpringCloud架構搭建之Nacos服務注冊與發現

點選“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平台檢視:

一、SpringCloud架構搭建之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