Kitty-Cloud服務搭建過程剖析

猿天地發表於2020-04-16

專案地址

https://github.com/yinjihuan/kitty-cloud

服務搭建

大家目前看到的都是我已經搭建好了的服務,如果讓你從零開始自己搭建一個微服務的專案,要怎麼做?

我們以kitty-cloud-article服務來進行講解,希望大家看完後也能自己動手大家一個屬於你自己的微服務專案。

建立Maven多模組專案

建立Maven專案有很多種方式,一般建立Spring Boot的Maven專案我們會用 https://start.spring.io/ 這個頁面提供的工具來生成,然後匯入到IDEA中就可以了。

或者直接在IDEA中建立一個Maven專案,選擇選單Filte --> New --> Project --> Maven專案,然後依次填寫資訊,最後會生成一個Maven專案。

比如你建立了一個空的Kitty-Cloud專案,然後就需要建立子模組了。建立子模組也非常簡單,選中剛剛建立的Kitty-Cloud,右鍵選擇New --> Module --> Maven 依次填寫資訊,跟上面的一樣。

子模組下面我們還細分了三個子模組,分別是api,biz,provider。所以還需要按照上面的步驟分別建立這三個子模組。成功後就是下圖的效果:

新增相關框架的依賴

api依賴

<dependencies>
    <dependency>
        <groupId>com.cxytiandi</groupId>
        <artifactId>kitty-spring-cloud-starter-web</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>com.spring4all</groupId>
        <artifactId>swagger-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>com.cxytiandi</groupId>
        <artifactId>kitty-spring-cloud-starter-feign</artifactId>
    </dependency>
</dependencies>

kitty-spring-cloud-starter-web:web依賴,基於spring-boot-starter-web包裝的,原始碼在kitty倉庫中。optional設定為true是不想強依賴,這邊只是要用到Spring裡面的內容。如果哪個模組依賴api模組,那麼需要該模組自身有web的依賴。

swagger-spring-boot-starter:swagger依賴,用於生成swagger文件。

kitty-spring-cloud-starter-feign:feign依賴,基於spring-cloud-starter-openfeign包裝的,原始碼在kitty倉庫中。

biz依賴

<dependencies>
    <dependency>
        <groupId>com.cxytiandi</groupId>
        <artifactId>kitty-cloud-user-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.cxytiandi</groupId>
        <artifactId>kitty-spring-cloud-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.cxytiandi</groupId>
        <artifactId>kitty-spring-cloud-starter-mybatis</artifactId>
    </dependency>
    <dependency>
        <groupId>com.cxytiandi</groupId>
        <artifactId>kitty-spring-cloud-starter-nacos</artifactId>
    </dependency>
    <dependency>
        <groupId>com.cxytiandi</groupId>
        <artifactId>kitty-spring-cloud-starter-jetcache</artifactId>
    </dependency>
    <dependency>
        <groupId>com.cxytiandi</groupId>
        <artifactId>kitty-spring-cloud-starter-cat</artifactId>
    </dependency>
    <dependency>
        <groupId>com.cxytiandi</groupId>
        <artifactId>kitty-spring-cloud-starter-dubbo</artifactId>
    </dependency>
    <dependency>
        <groupId>com.cxytiandi</groupId>
        <artifactId>kitty-spring-cloud-starter-sentinel</artifactId>
    </dependency>
    <dependency>
        <groupId>com.cxytiandi</groupId>
        <artifactId>kitty-spring-cloud-starter-lock</artifactId>
    </dependency>
</dependencies>

kitty-cloud-user-api:需要呼叫使用者服務的介面,所以這邊依賴了使用者服務的API模組。這也是我們為什麼要講API模組單獨抽出來的原因,方便其他服務依賴然後呼叫服務中的介面。

kitty-spring-cloud-starter-mybatis:mybatis依賴,基於mybatis-plus包裝。

kitty-spring-cloud-starter-nacos:nacos依賴,基於spring-cloud-starter-alibaba-nacos-discovery包裝。

kitty-spring-cloud-starter-jetcache: jetcache依賴,基於jetcache-starter-redis包裝。

kitty-spring-cloud-starter-cat:cat依賴,基於cat-client包裝。

kitty-spring-cloud-starter-dubbo:dubbo依賴,基於spring-cloud-starter-dubbo包裝。依賴dubbo是為了同時支援Http和Rpc兩種協議。

kitty-spring-cloud-starter-sentinel:sentinel依賴,基於spring-cloud-starter-alibaba-sentinel包裝。

kitty-spring-cloud-starter-lock:分散式鎖依賴,基於redisson-spring-boot-starter

包裝。

provider依賴

<dependencies>
    <dependency>
        <groupId>com.cxytiandi</groupId>
        <artifactId>kitty-cloud-article-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.cxytiandi</groupId>
        <artifactId>kitty-cloud-article-biz</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

kitty-cloud-article-api:依賴api定義模組。

kitty-cloud-article-biz:依賴業務邏輯模組。

spring-boot-starter-test:單元測試依賴。

服務啟動

provider作為服務的啟動模組,依賴了api和biz。我們在provider中建立App啟動類。

/**
 * 文章服務啟動類
 *
 * @作者 尹吉歡
 * @個人微信 jihuan900
 * @微信公眾號 猿天地
 * @GitHub https://github.com/yinjihuan
 * @作者介紹 http://cxytiandi.com/about
 * @時間 2020-02-12 20:01:04
 */
@EnableSwagger2Doc
@MapperScan("com.cxytiandi.kittycloud.article.biz.dao")
@EnableDiscoveryClient
@EnableCreateCacheAnnotation
@EnableMethodCache(basePackages = "com.cxytiandi.kittycloud.article.biz.manager")
@SpringBootApplication(scanBasePackages = {"com.cxytiandi.kittycloud.article","com.cxytiandi.kitty.web.config"})
public class KittyCloudArticleProviderApp {
    public static void main(String[] args) {
        SpringApplication.run(KittyCloudArticleProviderApp.class);
    }
}

@EnableSwagger2Doc:啟用Swagger。

@MapperScan:Mybatis Mapper包掃描路徑。

@EnableDiscoveryClient:啟用服務發現。

@EnableCreateCacheAnnotation:jetCache中啟用註解建立快取,比如 @CreateCache。

@EnableMethodCache:jetCache中啟用啟用方法上註解快取,比如 @Cache。

@SpringBootApplication:Spring Boot核心註解,主要關注下scanBasePackages裡面的值,如果不配置,預設掃描啟動類所在包的路徑以及子路徑。

配置了就按配置的來,因為我們的啟動類在provider中,provider中的包名無法包含api和biz。

比如:

com.cxytiandi.kittycloud.article.api
com.cxytiandi.kittycloud.article.biz
com.cxytiandi.kittycloud.article.provider

如果不手動指定scanBasePackages=com.cxytiandi.kittycloud.article的話就無法掃描api和biz。只能掃描到com.cxytiandi.kittycloud.article.provider。

com.cxytiandi.kitty.web.config是web模組中有對Swagger靜態資源對映的配置,也需要掃描到。

服務配置

resources --> META-INF --> app.properties

# Cat中的應用名稱
app.name=kitty-cloud-article-provider

resources --> bootstrap.properties

# 服務名
spring.application.name=kitty-cloud-article-provider
# dubbo配置
dubbo.scan.base-packages=com.cxytiandi.kittycloud.article.provider.service
dubbo.protocol.name=dubbo
dubbo.protocol.port=20081
dubbo.registry.address=spring-cloud://localhost
# nacos註冊服務端地址
spring.cloud.nacos.discovery.server-addr=47.105.66.210:8848
# nacos配置服務端地址
spring.cloud.nacos.config.server-addr=${spring.cloud.nacos.discovery.server-addr}
# sentinel資料來源地址
spring.cloud.sentinel.datasource.nacos.server-addr=${spring.cloud.nacos.discovery.server-addr}
# mysql配置資訊(原始配置在Nacos中儲存)
spring.cloud.nacos.config.ext-config[0].data-id=kitty-cloud-mysql.properties
spring.cloud.nacos.config.ext-config[0].group=MIDDLEWARE_GROUP
spring.cloud.nacos.config.ext-config[0].refresh=true
# 應用配置資訊(原始配置在Nacos中儲存)
spring.cloud.nacos.config.ext-config[1].data-id=kitty-cloud-article-provider-application.properties
spring.cloud.nacos.config.ext-config[1].group=APPLICATION_GROUP
spring.cloud.nacos.config.ext-config[1].refresh=true
# jetcache配置資訊(原始配置在Nacos中儲存)
spring.cloud.nacos.config.ext-config[2].data-id=kitty-cloud-redis-jetcache.properties
spring.cloud.nacos.config.ext-config[2].group=MIDDLEWARE_GROUP
spring.cloud.nacos.config.ext-config[2].refresh=true
# sentinel配置資訊(原始配置在Nacos中儲存)
spring.cloud.nacos.config.ext-config[3].data-id=kitty-cloud-sentinel.properties
spring.cloud.nacos.config.ext-config[3].group=MIDDLEWARE_GROUP
spring.cloud.nacos.config.ext-config[3].refresh=true
# redisson配置資訊(原始配置在Nacos中儲存)
spring.cloud.nacos.config.ext-config[4].data-id=kitty-cloud-redis-redisson.properties
spring.cloud.nacos.config.ext-config[4].group=MIDDLEWARE_GROUP
spring.cloud.nacos.config.ext-config[4].refresh=true

resources --> logback.xml

<appender name="CatAppender" class="com.dianping.cat.logback.CatLogbackAppender"></appender>
<root level="INFO">
    <appender-ref ref="CatAppender" />
</root>

logback主要關注的就是這個CatAppender,不配置CatAppender的話當程式報錯的時候,error級別的日誌無法接入Cat。

相關文章