springcloud alibaba 服務註冊與服務調用和動態加載配置

在入門 SpringCloudAlibaba 時在網上有噴這門技術的有對技術保持敬畏的下面推薦幾篇文章很有意思

下面是我從網上找來的一些 SpringCloud 和 SpringCloudAlibaba 技術棧的不同

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

先來啓動 SpringCloudAlibaba 的註冊中心 Nacos 這個很簡單可以參照 nacos 官網進行

https://nacos.io/zh-cn/docs/quick-start.html

編寫一個服務提供者

首先需要導入相關依賴

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.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-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </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>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在配置文件中指定服務註冊中心

server.port=8081
spring.application.name=nacos-server-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*

在啓動類中添加註解並編寫一個基礎服務

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

    @Data
    @RestController
    class EchoController {
        @Value("${server.port}")
        private String port;
        @GetMapping(value = "/echo/{string}")
        public String echo(@PathVariable String string) {
            return string + "(" + port + ")";
        }
    }
}

下面我們編寫服務消費者

  • 導入和服務提供者相同的依賴如果選擇 Feign 來作服務直接的交互就導入 Feign 的依賴
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 配置註冊中心
server.port=8082
spring.application.name=nacos-server-caller
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
  • 在入口程序添加註解並注入bean
/**
 * 如果使用 Feign 來進行調用需要添加 @EnableFeignClients 否則不需要
 */
@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
public class NacosserverclientApplication {

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

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

編寫 Controller 進行服務消費

@RestController
public class TestController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping(value = "/echo-rest/{str}")
    public String rest(@PathVariable String str) {
        return "rest::" + restTemplate.getForObject("http://nacos-server-provider/echo/" + str, String.class);
    }

    @Autowired(required = true)
    private NacosServerProvider nacosServerProvider;

    @GetMapping(value = "/echo-feign/{str}")
    public String feign(@PathVariable String str) {
        return nacosServerProvider.echo(str);
    }

}

NacosServerProvider 接口

@Repository
@FeignClient(name = "nacos-server-provider")
public interface NacosServerProvider {

    @GetMapping("/echo/{str}")
    String echo(@PathVariable("str") String str);

}

Nacos 的這個下線功能很有意思

在這裏插入圖片描述

  • 他只是在邏輯層面上對服務進行了下線
  • 也就是說當服務消費者向服務提供者發起請求時不會選擇下線了的服務

通過 Nacos 來對服務的配置進行動態加載

直接基於以上代碼進行更改在服務提供者中添加依賴

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

在 resources 目錄下創建 bootstrap.yml 文件並添加配置

spring:
  application:
    name: nacos-server-provider
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848

在配置文件類中添加 @RefreshScope 註解

@Data
@RestController
@RefreshScope
public class EchoController {
    @Value("${server.port}")
    private String port;
    // ${<配置文件中的key>:<配置文件中沒有key時的默認值>} 默認情況下如果key沒有找到就會在初始化時報錯
    @Value("${time:10}")
    private String time;

    @GetMapping(value = "/echo/{string}")
    public String echo(@PathVariable String string) {
        return string + "(" + port + "):[time:" + time +"]";
    }
}

在 Nacos 中添加配置文件

在這裏插入圖片描述

  • DataID 的值爲: <bootstrap文件中配置的項目名>-<項目環境>.<配置文件類型>
  • 然後在Nacos配置文件中修改值就會刷新到項目中了
發佈了52 篇原創文章 · 獲贊 41 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章