設定中心Nacos(服務發現)

2022-05-26 18:00:07

服務演變之路

單體應用架構

在剛開始的時候,企業的使用者量、資料量規模都⽐較⼩,項⽬所有的功能模組都放在⼀個⼯程中編碼、編譯、打包並且部署在⼀個Tomcat容器中的架構模式就是單體應用架構,這樣的架構既簡單實用、便於維護,成本⼜低,成為了那個時代的主流架構⽅式。這時候由於業務以及規模都⽐較⼩,所以⽆論服務以及DB都是使⽤單節點(all-in-one)的⽅式進⾏部署,這就是單體架構。

nacos-provider相關程式碼

主pom

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Cloud Alibaba Nacos Discovery -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- Spring Cloud -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>
  • nacos-provider-web

pom

<dependencies>
    <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.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

yaml

server:
  port: 7000

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

NacosProviderApplication

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

ProviderController

@Slf4j
@RestController
@RequestMapping("/provider")
public class ProviderController {
    
   @Resource
    private ProviderService providerService;
    
   @RequestMapping("/hello")
    public String hello() {
        log.info("使用者端hello");
        return providerService.hello();
    }
}

providerService

@FeignClient(name = "nacos-consumer")
public interface ProviderService {
    @GetMapping("/consumer/hello")
    String hello();
}

nacos-consumer相關程式碼

主pom

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Cloud Alibaba Nacos Discovery -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- Spring Cloud -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>
  • nacos-consumer-web

pom

<dependencies>
    <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.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

ymal

server:
  port: 7002
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

NacosConsumerApplication

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

ConsumerController

@Slf4j
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    @Resource
    private ProviderService providerService;

    /**
     * 基於Feign呼叫
     * http://localhost:7002/consumer/hello
     */
    @GetMapping("/hello")
    public String hello() {
        log.info("Feign invoke!");
        return providerService.hello();
    }
}

基於Feign + Ribbon + Nacos的服務呼叫

image-20220204160349510

基於Dubbo + Nacos的服務呼叫

image-20220204160749561