项目搭建的知识点
搭建聚合工程
由于之前都是简单的小demo,小项目,只是简单搭建过这样的工程,真正写的时候还是有一点小知识在里面。
1,父工程pom文件
父工程的相当于一个空壳,也就是几乎啥都不干,自己感觉就像一个装东西的容器,管理子工程所用的依赖。
pom文件需要注意的点:
- 让父工程管理资源的版本
- 子工程的依赖不标明版本
截取一点:
properties中设置了使用依赖的版本号。
dependencyManagement 中引用的依赖是要管理的依赖,并不是实际已经引用过的依赖,子工程如果要使用还需要写出引用,只不过不用写版本(就算自带版本也要删掉,这样可以避免版本冲突)。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RC1</spring-cloud.version>
<mybatis.starter.version>1.3.2</mybatis.starter.version>
<mapper.starter.version>2.0.2</mapper.starter.version>
<druid.starter.version>1.1.9</druid.starter.version>
<mysql.version>5.1.32</mysql.version>
<pageHelper.starter.version>1.2.3</pageHelper.starter.version>
<leyou.latest.version>1.0.0-SNAPSHOT</leyou.latest.version>
<fastDFS.client.version>1.26.1-RELEASE</fastDFS.client.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mybatis启动器 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.starter.version}</version>
</dependency>
<!-- 通用Mapper启动器 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${mapper.starter.version}</version>
</dependency>
<!-- 分页助手启动器 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pageHelper.starter.version}</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--FastDFS客户端-->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>${fastDFS.client.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--如果是项目内所有子项目都要用到的包可以定义在下面-->
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
</dependencies>
2 子工程的创建
首先创建的是EurekaServer,注册中心,起到滴滴打车公司一样的作用,想打车给你叫车,想服务给你客户,也像一个菜市场,小摊和买家。
所以最先创建的就应该是它(不过不启动的状态下,先创建哪个都行)。
2.1 创建注册中心Eureka
第一步在 idea 创建一个model,实际开发中他就是一个单一的注册中心微服务,是独立的。不过我就一台电脑,这样方便开发。
springcloud中的套路都是一样的,就是用什么引什么依赖,在springboot启动类中注解开启就行,有的需要在yml文件中进行配置。
因为它就作为一个注册中心,不用什么其它的东西了。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
下面是yml文件(yml文件的好处下面讲)
配置的具体细节用到再说
server:
port: 10086
spring:
application:
name: ly-registry
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
#如果有多个eureka服务端,上面就输入对方的地址,相互注册,如果是客户端,就把他们所有的
#地址写上,用逗号隔开就好。
register-with-eureka: false #设置不注册自己
fetch-registry: false #不拉取自己
server:
enable-self-preservation: false #关闭自我保护
下面是启动类,通过注解开启Eureka的服务。
@SpringBootApplication
@EnableEurekaServer
public class LyRegistry {
public static void main(String[] args) {
SpringApplication.run(LyRegistry.class);
}
}
到这里注册中心的所有配置就都完成了。
2.2 创建Zuul网关
与上面类似,选择maven方式创建Module,然后项目名称为:ly-gateway
因为是网关,所以yml文件中要配置很多。
pom
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>com.hao.service</groupId>
<artifactId>ly-auth-common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.hao.common</groupId>
<artifactId>ly-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
yml
server:
port: 10010
spring:
application:
name: api-gateway
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
registry-fetch-interval-seconds: 5 #拉取时长默认30,改为5秒一拉取
instance:
prefer-ip-address: true
ip-address: 127.0.0.1
instance-id: ${spring.application.name}:${server.port}
#
zuul:
prefix: /api # 添加路由前缀,是全局的前缀,请求都得加上api
routes:
item-service: /item/** #可以省略,但是默认是/item-service/**,这样改下路径,前面是eureka的服务id,后面是映射路径
search-service: /search/**
user-service: /user/**
auth-service: /auth/**
cart-service: /cart/**
order-service: /order/**
upload-service:
path: /upload/**
serviceId: upload-service
strip-prefix: false
# 上面这句去除前缀
# 上面配upload-service是因为会少一个upload,所以这样写
add-host-header: true #携带请求本身的host头信息
sensitive-headers: #禁止使用的头信息,设置为null,否则set-cookie无效
# retryable: true
ribbon:
ConnectTimeout: 1000 # 连接超时时间(ms)1000
ReadTimeout: 3500 # 通信超时时间(ms)3500
MaxAutoRetries: 0 # 同一实例的重试次数
MaxAutoRetriesNextServer: 0 # 同一服务不同实例的重试次数
# OkToRetryOnAllOperations: true # 是否对所有操作重试
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMillisecond: 5000 # 熔断超时时长:5秒
ly:
jwt:
pubKeyPath: E:/Java_IOTest/leyoumiyao/rsa.pub # 公钥地址
cookieName: LY_TOKEN
filter:
allowPaths:
- /api/auth
- /api/search
- /api/user/register
- /api/user/check
- /api/user/code
- /api/item
2.3 创建商品微服务 ly-item
因为与商品的品类相关,我们的工程命名为ly-item.
需要注意的是,我们的ly-item是一个微服务,那么将来肯定会有其它系统需要来调用服务中提供的接口,因此肯定也会使用到接口中关联的实体类。
因此这里我们需要使用聚合工程,将要提供的接口及相关实体类放到独立子工程中,以后别人引用的时候,只需要知道坐标即可。
我们会在ly-item中创建两个子工程:
- ly-item-interface:主要是对外暴露的API接口及相关实体类
- ly-item-service:所有业务逻辑及内部使用接口
就像下图,一个父工程里面嵌套一个父工程。服务方便调用,也更加安全。
调用关系图:
懒得加pom文件,直接上yml图:
server:
port: 8081
spring:
application:
name: item-service
datasource:
url: jdbc:mysql://localhost:3306/leyou
username: root
password: 239900
rabbitmq:
host: 192.168.209.128
username: leyou
password: 239900
virtual-host: /leyou
template:
retry:
enabled: true #重试开始
initial-interval: 10000ms #重试在10秒后开始
max-interval: 300000ms #重试周期超过30秒停止
multiplier: 2 #重试失败一次X2后再进行重试
exchange: ly.item.exchange #设置默认交换机
publisher-confirms: true #生产者确认,上面retry是重试的相关信息
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
# 下面可以设置从注册中心拉取服务的间隔时间,默认30秒
# registry-fetch-interval-seconds:
instance:
lease-renewal-interval-in-seconds: 5 # 每隔5秒发送一次心跳
lease-expiration-duration-in-seconds: 10 # 10秒不发送就过期
prefer-ip-address: true
ip-address: 127.0.0.1
instance-id: ${spring.application.name}:${server.port}
#mybatis:
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
启动类:
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan("com.hao.item.mapper")
public class LyItemApplication {
public static void main(String[] args) {
SpringApplication.run(LyItemApplication.class);
}
}
到这里,项目最基本的搭建也就结束了,用到的具体细节知识放到微服务单独讲解。
yml文件
yml文件的好处:树状结构,一目了然,写的时候会有代码提示,不过实质上跟properties是差不多的。
不过优先级不如 properties 文件:
如果两个文件配置一样的相关配置,比如一个项目中
yml中配置 port:8081,
properties中配置 port:8082,
最后项目读取的配置是8082,而不会去读取yml文件中的配置。
yml中格式有要求,空格要对好,不过相比这些要求,我感觉好看的树形结构,配置代码提示对开发是很友好的。
当然自己写的项目选择什么没人要求。