标签: Spring

Spring Cloud 简介

Spring Cloud 是什么?Spring Cloud 是当下最流行的微服务框架,它为微服务架构中涉及的服务治理、配置管理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。相比Dubbo、Sofa、ServiceComb等RPC框架它提供的是全套的分布式系统解决方案。它利用自家的Spring Boot的开发便利性简化了分布式系统的基

Spring Cloud 注册中心 Eureka(集群和权限)

集群单节点的注册中心实在是不保险,一旦注册中心出问题,整个微服务都受牵连,所以我们接下来要实现多个节点的注册中心,网上很多文章,弄2个节点互相注册,为了体现不一样,我们弄3个节点。权限上一篇的 Eureka 太low了,连个权限验证都没有,如果被人发现了eureka的地址是可以随意向其注册服务的,而且提供的web界面也将随意访问,这一篇给它加上个权限验证。先来实现权限验证,这个可以借助Spring

Spring Cloud 注册中心 Eureka

Spring Cloud 对服务治理做了抽象,因此Spring Cloud支持多种不同的服务治理框架,例如:Eureka、Consul、Zookeeper、Nacos 等等。我们可以切换不同的服务治理实现,而不影响服务注册、服务、调用等功能。下面我们来配置一个Eureka先看看注册中心是什么样的。pom.xml<dependency> <groupId>org.spr

Spring MVC Interceptor 实现性能监控

利用Spring MVC 的 Interceptor 实现个简易的性能监控,计算一下每个url的执行时间。在 preHandle 方法中记录当前的时间戳到线程局部变量里,然后在afterCompletion方法中,用当前的时间戳剪掉线程局部变量里的时间戳得出个运行时间,并记录到log里。这只是个简易的性能监控,如果想长期正式的监控性能,请选择其它成熟的产品。Interceptorimport javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.core.NamedThreadLocal;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class PerformanceInterceptor implements HandlerInterceptor { private final static Logger LOGGER = LoggerFactory.getLogger(PerformanceInterceptor.class); private NamedThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("performance"); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { startTimeThreadLocal.set(System.currentTimeMillis()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { return; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { long currentTime = System.currentTimeMillis(); long executeTime = currentTime - startTimeThreadLocal.get(); LOGGER.info("uri:{} 执行了 {} 毫秒", request.getRequestURI(), executeTime); }}

Spring Data JPA 通过 Query DSL查询数据

昨天写 JPA的查询方式,里面关于QueryDSL的部分没有写,当时因为一直报错,现在错误解决了,补上 Spring Data JPA 通过 Query DSL 查询的实现。另2篇:Spring Data JPA 的查询方式You need to run build with JDK or have tools.jar on the classpathpom<dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId></dependency><dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId></dependency><dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>1.7</version> <scope>system</scope> <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath></dependency>官网和一些其他示例并没有提及tools,但没有这个会报错的,IDE里面就报了。除了上面的配置还要添加构建插件

Spring Data JPA 分页查询

Spring Data JPA 自带了分页功能,分页功能有2个查询,分别是:查询总记录数;根据每页显示数量和起始位置查询一页数据;查询总记录数的几种方式1、用Spring Data自带的方法查询//没有参数,返回对应类型的所有记录数,这里为什么没说返回整张表的记录数?因为有时候可以多个实体共用一个表。org.springframework.data.repository.CrudRepositorylong count();//下面2个是带条件查询总记录数的方法org.springframework.data.repository.query.QueryByExampleExecutor<S extends T> long count(Example<S> example);org.springframework.data.jpa.repository.JpaSpecificationExecutorlong count(Specification<T> spec);

Spring IOC 的 alias 正确用法

Spring IOC 的 alias 有些人甚至都没听过,即使听过,也未必知道它真正的用途。定义 Bean 的时候,id 必须是唯一的,要保证在整个IOC容器内的唯一性,name 可以重复,并且可以指定多个,用逗号分隔。获取bean的时候用 id 或 name都可以。示例:applicationContext.getBean("defaultMessageService", MessageService.class);很多人对 alias 的了解仅限于此,下面说一下它真正的用途。例如有一个工程A,代码如下public interface MessageService { void send(); void send(String content);}

Spring IOC 容器启动时候初始化sql脚本Spring Boot版

之前没用 Spring Boot 的时候用 jdbc:script 标签设置初始化 sql 脚本,如下<jdbc:initialize-database data-source="dataSource" enabled="true" ignore-failures="NONE"> <jdbc:script execution="INIT" encoding="utf-8" location="classpath:sql/prod-data.sql" /> <jdbc:script execution="INIT" encoding="utf-8" location="classpath:sql/dev-data.sql" /></jdbc:initialize-database>

Spring IOC 容器启动时候初始化sql脚本

先说一下背景,项目中每个人都承担了一些模块的开发工作,而这些模块之间耦合性又比较大。例如,A的功能需要从B和C的模块获取数据。因此我们设计了一个数据导入功能,每个人开发完自己的功能模块后,把测试用的数据写入sql脚本,这样其他人更新了代码后,执行导入就可以用别人的模块了。配置如下,测试环境使用h2数据库并在IOC容器启动的时候初始化一些数据<beans profile="test"> <context:property-placeholder location="classpath:config-global.properties,classpath:config-env-test.properties" file-encoding="UTF-8" /> <jdbc:embedded-database id="dataSource" type="H2"> <jdbc:script execution="INIT" encoding="utf-8" location="classpath:sql/prod-data.sql" /> <jdbc:script execution="INIT" encoding="utf-8" location="classpath:sql/dev-data.sql" /> </jdbc:embedded-database></beans>