乐优商城项目总结——02项目搭建

项目搭建的知识点

搭建聚合工程

由于之前都是简单的小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中格式有要求,空格要对好,不过相比这些要求,我感觉好看的树形结构,配置代码提示对开发是很友好的。

当然自己写的项目选择什么没人要求。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值