项目地址

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依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.cxytiandi</groupId>
  4. <artifactId>kitty-spring-cloud-starter-web</artifactId>
  5. <optional>true</optional>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.spring4all</groupId>
  9. <artifactId>swagger-spring-boot-starter</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.cxytiandi</groupId>
  13. <artifactId>kitty-spring-cloud-starter-feign</artifactId>
  14. </dependency>
  15. </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依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.cxytiandi</groupId>
  4. <artifactId>kitty-cloud-user-api</artifactId>
  5. <version>1.0-SNAPSHOT</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.cxytiandi</groupId>
  9. <artifactId>kitty-spring-cloud-starter-web</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.cxytiandi</groupId>
  13. <artifactId>kitty-spring-cloud-starter-mybatis</artifactId>
  14. </dependency>
  15. <dependency>
  16. <groupId>com.cxytiandi</groupId>
  17. <artifactId>kitty-spring-cloud-starter-nacos</artifactId>
  18. </dependency>
  19. <dependency>
  20. <groupId>com.cxytiandi</groupId>
  21. <artifactId>kitty-spring-cloud-starter-jetcache</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.cxytiandi</groupId>
  25. <artifactId>kitty-spring-cloud-starter-cat</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>com.cxytiandi</groupId>
  29. <artifactId>kitty-spring-cloud-starter-dubbo</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>com.cxytiandi</groupId>
  33. <artifactId>kitty-spring-cloud-starter-sentinel</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>com.cxytiandi</groupId>
  37. <artifactId>kitty-spring-cloud-starter-lock</artifactId>
  38. </dependency>
  39. </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依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.cxytiandi</groupId>
  4. <artifactId>kitty-cloud-article-api</artifactId>
  5. <version>1.0-SNAPSHOT</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.cxytiandi</groupId>
  9. <artifactId>kitty-cloud-article-biz</artifactId>
  10. <version>1.0-SNAPSHOT</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-test</artifactId>
  15. <scope>test</scope>
  16. </dependency>
  17. </dependencies>

kitty-cloud-article-api:依赖api定义模块。

kitty-cloud-article-biz:依赖业务逻辑模块。

spring-boot-starter-test:单元测试依赖。

服务启动

provider作为服务的启动模块,依赖了api和biz。我们在provider中创建App启动类。

  1. /**
  2. * 文章服务启动类
  3. *
  4. * @作者 尹吉欢
  5. * @个人微信 jihuan900
  6. * @微信公众号 猿天地
  7. * @GitHub https://github.com/yinjihuan
  8. * @作者介绍 http://cxytiandi.com/about
  9. * @时间 2020-02-12 20:01:04
  10. */
  11. @EnableSwagger2Doc
  12. @MapperScan("com.cxytiandi.kittycloud.article.biz.dao")
  13. @EnableDiscoveryClient
  14. @EnableCreateCacheAnnotation
  15. @EnableMethodCache(basePackages = "com.cxytiandi.kittycloud.article.biz.manager")
  16. @SpringBootApplication(scanBasePackages = {"com.cxytiandi.kittycloud.article","com.cxytiandi.kitty.web.config"})
  17. public class KittyCloudArticleProviderApp {
  18. public static void main(String[] args) {
  19. SpringApplication.run(KittyCloudArticleProviderApp.class);
  20. }
  21. }

@EnableSwagger2Doc:启用Swagger。

@MapperScan:Mybatis Mapper包扫描路径。

@EnableDiscoveryClient:启用服务发现。

@EnableCreateCacheAnnotation:jetCache中启用注解创建缓存,比如 @CreateCache。

@EnableMethodCache:jetCache中启用启用方法上注解缓存,比如 @Cache。

@SpringBootApplication:Spring Boot核心注解,主要关注下scanBasePackages里面的值,如果不配置,默认扫描启动类所在包的路径以及子路径。

配置了就按配置的来,因为我们的启动类在provider中,provider中的包名无法包含api和biz。

比如:

  1. com.cxytiandi.kittycloud.article.api
  2. com.cxytiandi.kittycloud.article.biz
  3. 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

  1. # Cat中的应用名称
  2. app.name=kitty-cloud-article-provider

resources --> bootstrap.properties

  1. # 服务名
  2. spring.application.name=kitty-cloud-article-provider
  3. # dubbo配置
  4. dubbo.scan.base-packages=com.cxytiandi.kittycloud.article.provider.service
  5. dubbo.protocol.name=dubbo
  6. dubbo.protocol.port=20081
  7. dubbo.registry.address=spring-cloud://localhost
  8. # nacos注册服务端地址
  9. spring.cloud.nacos.discovery.server-addr=47.105.66.210:8848
  10. # nacos配置服务端地址
  11. spring.cloud.nacos.config.server-addr=${spring.cloud.nacos.discovery.server-addr}
  12. # sentinel数据源地址
  13. spring.cloud.sentinel.datasource.nacos.server-addr=${spring.cloud.nacos.discovery.server-addr}
  14. # mysql配置信息(原始配置在Nacos中存储)
  15. spring.cloud.nacos.config.ext-config[0].data-id=kitty-cloud-mysql.properties
  16. spring.cloud.nacos.config.ext-config[0].group=MIDDLEWARE_GROUP
  17. spring.cloud.nacos.config.ext-config[0].refresh=true
  18. # 应用配置信息(原始配置在Nacos中存储)
  19. spring.cloud.nacos.config.ext-config[1].data-id=kitty-cloud-article-provider-application.properties
  20. spring.cloud.nacos.config.ext-config[1].group=APPLICATION_GROUP
  21. spring.cloud.nacos.config.ext-config[1].refresh=true
  22. # jetcache配置信息(原始配置在Nacos中存储)
  23. spring.cloud.nacos.config.ext-config[2].data-id=kitty-cloud-redis-jetcache.properties
  24. spring.cloud.nacos.config.ext-config[2].group=MIDDLEWARE_GROUP
  25. spring.cloud.nacos.config.ext-config[2].refresh=true
  26. # sentinel配置信息(原始配置在Nacos中存储)
  27. spring.cloud.nacos.config.ext-config[3].data-id=kitty-cloud-sentinel.properties
  28. spring.cloud.nacos.config.ext-config[3].group=MIDDLEWARE_GROUP
  29. spring.cloud.nacos.config.ext-config[3].refresh=true
  30. # redisson配置信息(原始配置在Nacos中存储)
  31. spring.cloud.nacos.config.ext-config[4].data-id=kitty-cloud-redis-redisson.properties
  32. spring.cloud.nacos.config.ext-config[4].group=MIDDLEWARE_GROUP
  33. spring.cloud.nacos.config.ext-config[4].refresh=true

resources --> logback.xml

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

logback主要关注的就是这个CatAppender,不配置CatAppender的话当程序报错的时候,error级别的日志无法接入Cat。

Kitty-Cloud服务搭建过程剖析的更多相关文章

  1. HTTPS静态服务搭建过程详解

    HTTPS服务对于一个前端开发者来说是一个天天打招呼的老伙计了,但是之前我跟HTTPS打交道的场景一直是抓包,自己没有亲自搭建过HTTPS服务,对HTTPS的底层知识也是一知半解.最近正好遇到一个用户 ...

  2. 微信小程序语音识别服务搭建全过程解析(项目开源在github)

    silk v3录音转olami语音识别和语义处理的api服务(ubuntu16.04服务器上实现) ## 重要的写在前面 重要事项一: 目前本文中提到的API已支持微信小程序录音文件格式:silk v ...

  3. 微信小程序语音识别服务搭建全过程解析(https api开放,支持新接口mp3录音、老接口silk录音)

    silk v3(或新录音接口mp3)录音转olami语音识别和语义处理的api服务(ubuntu16.04服务器上实现) 重要的写在前面 重要事项一: 所有相关更新,我优先更新到我个人博客中,其它地方 ...

  4. Spring Cloud云架构 - commonservice-sso服务搭建(一)

    前面几篇我们已经介绍了Spring Cloud和oauth2的知识点,今天我们要利用Spring Cloud和oauth2进行commonservice-sso服务搭建,本节我们只是搭建commons ...

  5. Spring Cloud云服务架构 - commonservice-config配置服务搭建

    1. 介绍 Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持.使用Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与 ...

  6. Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题

    现互联网公司后端架构常用到Spring+SpringMVC+MyBatis,通过Maven来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要 ...

  7. Centos 6.5 pptpd服务端搭建过程

    首先检测有没有启用ppp和tun cat /dev/ppp cat /dev/net/tun 如果显示是这样的 cat: /dev/ppp: No such device or address cat ...

  8. spring cloud 服务注册中心eureka高可用集群搭建

    spring cloud 服务注册中心eureka高可用集群搭建 一,准备工作 eureka可以类比zookeeper,本文用三台机器搭建集群,也就是说要启动三个eureka注册中心 1 本文三台eu ...

  9. 用Google Cloud Platform搭建***服务教程

    之前FQ一直用的是***,天有不测风云,前几天发现ss服务挂了.更可怕的是ping都ping不通,多方打听,***中文社区已经炸开锅了,原因就是IP被封了.需要付费更换IP.然后到现在还是没有给我更换 ...

随机推荐

  1. Xamarine ContentPage.ToolbarItems 未显示/不显示在界面

    将页面封装到NavigationPage中.在App.xaml.cs的构造函数中 将 MainPage = new MainPage(); 替换为 MainPage = new NavigationP ...

  2. httpServletRequest.getCharacterEncoding()取出来是个null,怎么办?

    因为浏览器没有把正确的编码方式给服务器端. 目前,许多浏览器在Content-Type头中不会指定字符编码方式,那么容器就会使用"ISO-8859-1"方式解析POST数据,而此时 ...

  3. Spring Boot入门系列(八)整合定时任务Task,一秒搞定定时任务

    前面介绍了Spring Boot 中的整合Redis缓存已经如何实现数据缓存功能.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/categ ...

  4. 矩阵快速幂-QuickPow

    矩阵快速幂引入: 1.整数快速幂: 为了引出矩阵的快速幂,以及说明快速幂算法的好处,我们可以先求整数的幂.如果现在要算X^8:则 XXXXXXXX 按照寻常思路,一个一个往上面乘,则乘法运算进行7次. ...

  5. matplotlib 中的一些参数设置

    首先:在pycharm 中要使图显示出来,最后一定要加上 plt.show(),如: plt.bar(x, y) plt.show() 下面就是我使用 matplotlib  遇到的一些常用参数设置: ...

  6. 简单BBS项目开始(二)

    登陆和生成图片验证码 1.生成图片 pillow 1.生成图片的模块pillow,在python中安装pillow,在Django中使用时用PIL2. 在页面上<img id="val ...

  7. drf 权限认证

    目录 复习 前期准备 三大认证简介 AbstracUser源码分析 自定义User下的权限六表 models.py 到settings.py中注册 注意点: 执行数据迁移的俩条命令 创建超级用户 t_ ...

  8. Python模块---Wordcloud生成词云图

    wordcloud是Python扩展库中一种将词语用图片表达出来的一种形式,通过词云生成的图片,我们可以更加直观的看出某篇文章的故事梗概. 首先贴出一张词云图(以哈利波特小说为例): 在生成词云图之前 ...

  9. 特征选择与稀疏学习(Feature Selection and Sparse Learning)

    本博客是针对周志华教授所著<机器学习>的"第11章 特征选择与稀疏学习"部分内容的学习笔记. 在实际使用机器学习算法的过程中,往往在特征选择这一块是一个比较让人模棱两可 ...

  10. Building Applications with Force.com and VisualForce(Dev401)(十五):Data Management: Data management Overview

    Dev401-016:Data Management: Data management Overview Course Objectives1.List typical data management ...