從零開始SpringCloud Alibaba電商系統(一)——Alibaba與Nacos服務註冊與發現

零、系列

歡迎來嫖從零開始SpringCloud Alibaba電商系列:

  1. 從零開始SpringCloud Alibaba電商系統(一)——Alibaba與Nacos服務註冊與發現
  2. 從零開始SpringCloud Alibaba電商系統(二)——Nacos配置中心
  3. 從零開始SpringCloud Alibaba電商系統(三)——Sentinel流量防衛兵介紹、流量控制demo
  4. 從零開始SpringCloud Alibaba電商系統(四)——Sentinel的fallback和blockHandler
  5. 從零開始SpringCloud Alibaba電商系統(五)——Feign Demo,Sentinel+Feign實現多節點間熔斷/服務降級
  6. 從零開始SpringCloud Alibaba電商系統(六)——Sentinel規則持久化到Nacos配置中心

一、SpringCloud Alibaba

什麼是SpringCloud Alibaba?
  簡言之,SpringCloud Alibaba是對SpringCloud全生態的一個封裝簡化,其中還引入了一些阿里自研或其他的開源組件。
  Alibaba讓我們更好的使用電商。

二、Nacos是什麼

Nacos官網原文:

Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。

用過springCloud的朋友知道,Nacos對標Erueka。
沒用過的朋友可以這樣理解,Nacos是一個路由表,我們的各個微服務Web之間相互尋找需要通過這個路由表。
比如業務A有兩個節點A1和A2,業務B有個節點B1想要調用A的某個接口。我們不需要在業務B中寫一堆A的url來調用api,只要告訴Nacos我們要找業務A,它就
會告訴我們業務A有哪些節點。

三、簡述CAP

我們可能經常聽說Zookeeper是CP的,Erueka是AP的,Nacos支持AP和CP之類的觀點,那麼CAP究竟是什麼呢?

CAP原則又稱CAP定理,指的是在一個分佈式系統中,一致性(Consistency)、可用性(Availability)、分區容錯性(Partition tolerance)。 ————百度百科

對於一個分佈式系統來說,P(分區容錯性)是必然,但是C(一致性)和可用性(A)之間卻存在衝突,只可取其一,舉個例子:

註冊中心註冊了N、M兩個系統節點,某天M系節點統通信不穩定了(心跳包有問題),
那麼對於要求C(一致性)來說,M系統節點將被禁止提供服務,即便這會造成其他節點壓力增大。
而對於A(可用性)來說,M系統需要工作,即使返回結果可能不準確也要提供生產力。

四、如何使用Nacos服務端

nacos服務端支持很多種部署方式,詳情見:https://nacos.io/zh-cn/docs/quick-start.html
筆者比較喜歡docker-compose,使用docker部署步驟如下:
1. 拉取nacos 源碼。
	git clone https://github.com/nacos-group/nacos-docker.git
	cd nacos-docker
2. nacos-docker自帶的examples/standalone-mysql-5.7.yaml文件默認會啓動一個自帶的mysql並連接。
    如果要使用自己的mysql,我們就需要修改yaml文件及一個mysql配置文件,並且自己將nacos所需的數據庫導入到我們使用的mysql中(這一點實在是太不友好了,希望未來會得到改進)。
    這裏不想再開啓一個mysql容器的同學可以和筆者一樣,選擇derby方式啓動(需要先安裝docker及docker-compose)。
    docker-compose -f example/standalone-derby.yaml up -d 
3. 頁面訪問 -->  http://ip:8848/nacos/

在這裏插入圖片描述

五、項目端集成Nacos-服務提供方

1. nacos-provider
pom.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
    </parent>
    <groupId>com.lele</groupId>
    <artifactId>mall</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>mall</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <!-- spring cloud alibaba,必須有,版本自選 -->
    <dependencyManagement>
        <dependencies>
            <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>



    <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>
        <!-- alibaba 必須有,版本自選-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- junit -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>



    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
2. application.properties文件如下:
server.port=8081
spring.application.name=order
spring.cloud.nacos.discovery.server-addr=之前的nacos服務端ip:8848
management.endpoints.web.exposure.include=*
3. application如下:
@SpringBootApplication
@EnableDiscoveryClient //必須有, 
public class MallApplication {

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

}

4、正常啓動後,我們會看到服務列表多出了我們的application。

在這裏插入圖片描述

六、項目端繼承Nacos-消費者方

在上面我們啓用了order模塊,order模塊提供了一些對外的api接口供其他服務調用,我們可以創建一個user項目來調用這個api(通過Nacos來調用)。
1. 首先,我們現在order模塊補上一個服務方法。
@RestController
    public class Hello {
        @GetMapping(value = "/hello/{string}")
        public String hello(@PathVariable String string) {
            return "Hello! 我是Order,感謝你(" + string+")來調用我的hello方法";
        }
    }
2. 然後,新建一個product,pom與application.properties與上面一樣不再贅述,這個項目我們給起名user。

在這裏插入圖片描述

3. 最後,我們在product中加入訪問order模塊API接口的方法。
@SpringBootApplication
@EnableDiscoveryClient
public class ProductApplication {

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

    public static void main(String[] args) {

        SpringApplication.run(ProductApplication.class, args);
    }

    @RestController
    public class NacosController{

        @Autowired
        private LoadBalancerClient loadBalancerClient;
        @Autowired
        private RestTemplate restTemplate;

        @Value("${spring.application.name}")
        private String appName;

        @GetMapping("/hi")
        public String hi(){
            ServiceInstance serviceInstance = loadBalancerClient.choose("order"); // 負載均衡獲取我們實際要訪問的項目地址
            String path = String.format("http://%s:%s/hello/%s",serviceInstance.getServiceId(),serviceInstance.getPort(),appName);
            System.out.println("request path:" +path);
            return restTemplate.getForObject(path,String.class);
        }
    }
}
4. 訪問product的接口,可以看到成功返回了orderAPI的信息,服務路由成功。

http://localhost:8082/hi
在這裏插入圖片描述

七、Demo代碼

Nacos服務註冊Demo代碼地址:https://github.com/flyChineseBoy/lel-mall/tree/master/mall01
mall目錄爲訂單模塊,product目錄爲庫存模塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章