springboot 项目开发说明

一、前言

    次说明参照新的项目体系结构编写,具体哪些是新的项目体系,请参照:项目统计

    随着我们对技术的不断深入,项目结构配置也会趋于更加透明简洁,所以项目体系会不断的更新,如有问题请咨询架构组

    截至目前,本文采用的Nove版本为1.2.9.RELEASE

    注意:API包除了依赖ecej-model 尽量不要依赖其他任何自定义包,否则以后发布公共接口可能导致各种奇葩问题

模板工程:http://10.4.96.22/luqiang/ecej-xxx/

二、应用技术说明

新的项目体系主要采用spring boot 、mybatis 、druid 、dubbo 

 

三、项目结构说明

下面说下基本项目结构,先看下新结构包含什么,以用户中心为例

新的项目结构摒弃了老结构中的dao 、po 等jar依赖

dao的东西经过配置化管理,只剩下了UcBaseDao 和 DBConfiguration(包括了数据源等配置,大家可以依葫芦画瓢自己试试)

po的东西以后放到自己的api中,记住api包不允许依赖任何jar包,以免出现恶心自己的问题

父POM中删除了无用的依赖,继承了底层平台POM

 

下面说下核心的数据源配置DBConfiguration

这个继承了AbstractDruidDBConfig 其实内部就是帮助大家加载了下数据源,方便配置而已

这是我们需要配置的属性,配置在remote-db.properties中

这就是我们的数据源声明

 

事物的声明,其实大家会发现只是换了个形式写而已,省去了xml配置

 

 

 

 

 

四、Redis的使用

说下redis使用,如果想在自己的项目中使用redis,如下先加入依赖

<dependency>

          <groupId>com.nove</groupId>

          <artifactId>ecej-redis</artifactId>

</dependency>

就可以了,然后我们只要配置我们的配置文件,不需要其他多余的工作

redis集群分为两种,sentinel 还有3.x的cluster,根据你自己的需要选择集群配置,配置文件都放在resources下面的,没有特殊要求的话请都使用3.x配置

1、先说sentinel配置

用法:使用com.ecej.nove.redis.utils.JedisClusterUtils这个静态类

remote-redis.properties

这个大家可以直接下载用

ecej.redis.hostName=@ecej.redis.hostName@

ecej.redis.password=@ecej.redis.password@

ecej.redis.mastername=@ecej.redis.mastername@

以下配置可选择增加

ecej.redis.maxIdle=@ecej.redis.maxIdle@

ecej.redis.maxTotal=@ecej.redis.maxTotal@

ecej.redis.maxWaitMillis=@ecej.redis.maxWaitMillis@

 

这是properties的配置

下面说下POM里面profile的配置

<ecej.redis.hostName>10.32.32.58:26379,10.32.32.58:26380,10.32.32.58:26381</ecej.redis.hostName>
<ecej.redis.mastername>redismaster</ecej.redis.mastername>
<ecej.redis.password><![CDATA[4BZcIv&9]]></ecej.redis.password>
<ecej.redis.maxIdle>10</ecej.redis.maxIdle>
<ecej.redis.maxTotal>1000</ecej.redis.maxTotal>
<ecej.redis.maxWaitMillis>3000</ecej.redis.maxWaitMillis>

 

2、下面再说下3.x的配置

remote-redis.properties

ecej.redis.password=@ecej.redis.password@

ecej.redis.hostName=@ecej.redis.hostName@

以下配置可选择增加

ecej.redis.maxIdle=@ecej.redis.maxIdle@

ecej.redis.maxTotal=@ecej.redis.maxTotal@

ecej.redis.maxWaitMillis=@ecej.redis.maxWaitMillis@

ecej.redis.maxRedirects=@ecej.redis.maxRedirects@

 

下面贴出profile的配置

<ecej.redis.hostName>10.4.89.161:6379</ecej.redis.hostName>
<ecej.redis.maxRedirects>10</ecej.redis.maxRedirects>
<ecej.redis.password></ecej.redis.password>
<ecej.redis.maxIdle>10</ecej.redis.maxIdle>
<ecej.redis.maxTotal>1000</ecej.redis.maxTotal>
<ecej.redis.maxWaitMillis>3000</ecej.redis.maxWaitMillis>

两种配置都有了,那下面说下怎么选择用哪种集群模式

ecej.redis.cluster=true  使用3.x模式

ecej.redis.sentinel=true 使用sentinel模式

注意:这俩配置选一个,放在application.properties中,不要乱放。

 

最后一步,配置文件读取

在PropertiesConfig中

 

package  com.ecej.nove.sms.config;
import  org.springframework.context.annotation.Configuration;
import  org.springframework.context.annotation.ImportResource;
import  org.springframework.context.annotation.PropertySource;
import  com.ecej.nove.base.config.AbstractPropertiesConfig;
@Configuration
@PropertySource (value = {  "classpath:remote-db.properties" "classpath:remote-dubbo.properties" , "classpath:remote-redis.properties"  }) //在这里加入redis配置读取
@ImportResource ({  "classpath:dubbo/*.xml"  })
public  class  PropertiesConfig  extends  AbstractPropertiesConfig {
}

 

3.Key的命名规范

应用名称
key定义
说明
公共COMM_XXX 
运营ADMIN_XXX 
用户CUST_XXX 
员工 EMP_XXX  
     
     

 

五、RabbitMQ 使用

RabbitMQ 使用说明

首先加入依赖

<dependency>
    <groupId>com.nove</groupId>
    <artifactId>ecej-rabbitmq</artifactId>
</dependency>

编写配置文件到application.properties 

spring.rabbitmq.addresses=@ecej.rabbitmq.addresses@

注意:有密码就加下面的配置,没有千万不要加(正常都应该有密码,没密码找运维)

spring.rabbitmq.username=@ecej.rabbitmq.username@
spring.rabbitmq.password=@ecej.rabbitmq.password@

下面贴出profile

<!-- Rabbit MQ -->
<ecej.rabbitmq.addresses>10.32.32.35:5672,10.32.32.37:5672,10.32.32.40:5672</ecej.rabbitmq.addresses>

<ecej.rabbitmq.username>ecej</ecej.rabbitmq.username>
<ecej.rabbitmq.password>ecej</ecej.rabbitmq.password>

 

配置队列

package  com.ecej.nove.sms.config;
import  org.springframework.amqp.core.Queue;
import  org.springframework.context.annotation.Bean;
import  org.springframework.context.annotation.Configuration;
@Configuration
public  class  RabbitMQConfig {
     @Bean
     public  Queue mailQueue() {
         return  new  Queue( "ecejmail" );
     }
     @Bean
     public  Queue smsQueue() {
         return  new  Queue( "ecejsms" );
     }
     @Bean
     public  Queue jpushQueue() {
         return  new  Queue( "ecejjpush" );
     }
}

 

 

发送消息

 


  package  com.ecej.nove.test.sms;
import  java.util.Date;
import  javax.annotation.Resource;
import  org.junit.Test;
import  org.springframework.amqp.rabbit.core.RabbitTemplate;
import  org.springframework.stereotype.Component;
import  com.ecej.nove.base.mail.BaseMail;
@Component
public  class  SendMailTest {
     @Resource
     private  RabbitTemplate rabbitTemplate;
     @Test
     public  void  sendMQ() {
         BaseMail baseMail =  new  BaseMail();
         baseMail.setTo( new  String[] {  "598505651@qq.com"  });
         baseMail.setSubject( "这是一个神奇的网站" );
         baseMail.setText( "这是一个一格" );
         baseMail.setCc( new  String[] {  "35329425@qq.com"  });
         rabbitTemplate.convertAndSend( "ecejmail" , baseMail);
         System.out.println( "Sender : "  + baseMail.getText());
         String context =  "baseMail.getText() "  new  Date();
         rabbitTemplate.convertAndSend( "ecejmail" , context);
     }
}


 

接收消息

 

package  com.ecej.nove.sms.mail;
import  javax.annotation.Resource;
import  org.apache.commons.collections.MapUtils;
import  org.slf4j.Logger;
import  org.slf4j.LoggerFactory;
import  org.springframework.amqp.rabbit.annotation.RabbitHandler;
import  org.springframework.amqp.rabbit.annotation.RabbitListener;
import  org.springframework.beans.factory.annotation.Value;
import  org.springframework.stereotype.Component;
import  com.ecej.nove.base.mail.BaseMail;
import  com.ecej.nove.sms.service.api.MailSendService;
/**
  * 接收邮件信息
  *
  * @author QIANG
  *
  */
@Component
@RabbitListener (queues =  "ecejmail" )
public  class  MailReceiverService {
 
     @Resource
     private  MailSendService mailSendService;
 
     @RabbitHandler
     public  void  ReceiverMessage(BaseMail mail) {
     }
 
     @RabbitHandler
     public  void  ReceiverMessage(String mail) {
         System.out.println(mail);
     }
}

 

六、druid的监控

因为我们现在都有druid,所以有配套的数据源监控

监控地址

http://localhost:8080/druid/index.html

用户名密码 默认 admin

 

七、spring sts插件

这个就大家按喜好安装吧,主要为了方便我们开发,IDEA直接支持了boot,eclipse得我们自己弄个插件,所以这玩意就是了。

有什么好处呢?

可以在properties中提示,当然,只有在application.properties中可以提示,还有各种别的用法我就不一一说了

 


安装方法

Help -》  install new software  

然后下一步下一步就行了,这个安装包地址https://spring.io/tools/sts/all


八、应用监控

spring boot给我们提供了很多监控,什么bean的啊,状态啊等等,回头我有空写几个介绍在这

1.应用异常信息推送.

通用服务AOP切面会统一处理系统异常,异常捕获后会直接发起一个独立的线程像收集服务器发送数据.

项目配置.properties中增加如下配置

 ecej-core 1.2.0+版本配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#项目名称
spring.application.name=ecej-xx
#数据处理服务地址
ecej.ops.url=exwarn.ecej.com
#数据处理服务端口
ecej.ops.port= 80
#可选择配置
#连接超时
ecej.ops.connect.timeout= 2000
#读超时
ecej.ops.read.timeout= 3000
#是否推送, 0 -否, 1 -是,默认是 0
ecej.ops.iswitch= 1
 

九、部署

部署命令

nohup java -jar -Xms2048m -Xmx2048m -Xmn512m -Xss256k -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump.hprof    xxx.jar  --server.port=8080 --log.home=/xxx/ --log.level=INFO --log.stdout=0 –ecej.ops.iswitch=1 --ecej.ops.port=80 --jmx.rmi.port=9999 &


server.port:内置tomcat端口,默认8999

jmx.rmi.port:JMX监控端口,默认9999

log.home:日志存放目录地址,默认为/data/dubbo/logs/应用名称

log.level:日志级别,默认DEBUG

log.stdout:是否输出日志到控制台,默认输出, "0"为不输出

ecej.ops.iswitch:是否开启异常推送

ecej.ops.port:异常推送服务端口

dubbo.port=默认分配,(如同一台部署多份请在默认端口值上加100以免重复)

server.context-path 项目访问路径(默认是,这样直接通过http://ip:port/就可以访问到index页面,如果要修改为http://ip:port/path/ 访问的话,那么需要在Application.properties文件中加入server.context-path = /你的path

 

 

十、单元测试

package  com.ecej.uc.test.base;
import  com.ecej.uc.run.Startup;
import  org.junit.After;
import  org.junit.Before;
import  org.junit.runner.RunWith;
import  org.springframework.boot.test.context.SpringBootTest;
import  org.springframework.test.context.junit4.SpringRunner;
/**
  * Created by mijp on 2017/1/11.
  */
@RunWith (SpringRunner. class )
@SpringBootTest (classes = Startup. class )
public  class  UcBaseTest {
 
     @Before
     public  void  before() {
         System.out.println( "测试开始>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" );
     }
     @After
     public  void  after() {
         System.out.println( "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<测试完成" );
     }
}

继承上边的类即可

十一、异常处理

1.基本异常处理流程

异常处理

总体原则说明,controller层服务调用必须有try{}catch处理,不能在向上抛.已经是顶层了.可以通过AOP切面统一处理.如果当前web服务返回包含数据返回(JSON)和页面返回,可以分为两个package,设置两个切面分别处理

案例1:controller处理异常方法. 使用AOP拦截器对异常统一处理,保证有一个合适的返回值

controller 不建议有业务处理流程,包括返回值的额外处理流程,所以只处理返回信息即可.

AOP simple

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当前课程中博客项目的实战源码是我在 GitHub上开源项目 My-Blog,目前已有 3000 多个 star:本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 个人博客项目功能的讲解,通过本课程的学习,不仅仅让你掌握基本的 Spring Boot 开发能力以及 Spring Boot 项目的大部分开发使用场景,同时帮你提前甄别和处理掉将要遇到的技术难点,认真学完这个课程后,你将会对 Spring Boot 有更加深入而全面的了解,同时你也会得到一个大家都在使用的博客系统源码,你可以根据自己的需求和想法进行改造,也可以直接使用它来作为自己的个人网站,这个课程一定会给你带来巨大的收获。作者寄语本课程录制于 2020 年,代码基于 Spring Boot 2.x 版本。到目前为止,Spring Boot 技术栈也有一些版本升级,比如 Spring Boot 2.7 发版、Spring Boot 3.x 版本发布正式版本。对于这些情况,笔者会在本课程实战项目的开源仓库中创建不同的代码分支,保持实战项目的源码更新,保证读者朋友们不会学习过气的知识点。课程特色 课程内容紧贴 Spring Boot 技术栈,涵盖大部分 Spring Boot 使用场景。开发教程详细完整、文档资源齐全、实验过程循序渐进简单明了。实践项目页面美观且实用,交互效果完美。包含从零搭建项目、以及完整的后台管理系统和博客展示系统两个系统的功能开发流程。技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,对于提升你的市场竞争力有一定的帮助。实战项目预览    
文档内容 一、 Spring介绍 1 1.1、SpringBoot简介 1 1.2、系统要求: 1 1.3、SpringBoot和SpringMVC区别 1 1.4、SpringBoot和SpringCloud区别 2 1.5常见错误 2 二、快速入门 2 2.1、创建一个Maven工程 2 2.2、pom文件引入依赖 3 2.3、编HelloWorld服务 3 2.4、@RestController 4 2.5、@EnableAutoConfiguration 4 2.6 SpringApplication.run(HelloController.class, args); 4 2.7、SpringBoot启动方式1 4 2.8、SpringBoot启动方式2 4 2.9、SpringBoot启动方式3 5 三、 Web开发 5 3.1、静态资源访问 5 3.2、渲染Web页面 5 3.3、使用Freemarker模板引擎渲染web视图 6 3.3.1、pom文件引入: 6 3.3.2、后台代码 6 3.3.3、前台代码 6 3.3.4、Freemarker其他用法 7 3.3.5、Freemarker配置 8 3.4、使用JSP渲染Web视图 8 3.4.1、pom文件引入以下依赖 8 3.4.2、在application.properties创建以下配置 9 3.4.3、后台代码 9 3.5、全局捕获异常 10 四、 数据访问 10 4.1、springboot整合使用JdbcTemplate 10 4.2、springboot整合使用mybatis 12 4.3、springboot整合使用springjpa 18 4.4、springboot整合多数据源 19 五、 事物管理 25 5.1.1SpringBoot整合事物管理 25 5.1.2SpringBoot分布式事物管理 25 六、 日志管理 30 6.1使用log4j记录日志 30 6.2使用AOP统一处理Web请求日志 32 6.3Spring Boot集成lombok让代码更简洁 33 七、 缓存支持 35 7.1注解配置与EhCache使用 35 7.2使用Redis集成缓存 37 八、 热部署 37 8.1 什么是热部署 37 8.2 项目演示案例 37 8.3 热部署原理 37 8.4 Devtools依赖 38 8.5 Devtools原理 38 九、 监控管理 38 Actuator监控应用 38 Maven依赖 38 YML配置 39 Actuator访问路径 40 Admin-UI分布式微服务监控中心 40 Admin-UI-Server 40 Admin-UI-Client 41 十、 性能优化 43 组件自动扫描带来的问题 43 将Servlet容器变成Undertow 44 SpringBoot JVM参数调优 44 十一、 2.0版本新特性 45 以Java 8 为基准 45 内嵌容器包结构调整 45 Servlet-specific 的server properties调整 45 Actuator 默认映射 46 Spring Loaded不再支持 46 支持Quartz Scheduler 46 OAuth 2.0 支持 46 支持Spring WebFlux 46 版本要求 46 十二、 其他内容 47 12.1、使用@Scheduled创建定时任务 47 12.2、使用@Async实现异步调用 47 12.3、自定义参数 49 12.4、多环境配置 50 12.5、修改端口号 50 12.6、SpringBoot yml 使用 50 12.7、SpringBoot整合拦截器 51 12.8、发布打包 52

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值