springmvc+spring-security+mybatis +redis 框架抽取

转载博客:http://www.cnblogs.com/jennybackup/p/5286554.html

controller层配置文件介绍:

springmvc+spring-security+mybatis +redis 框架抽取_第1张图片

一.springmvc 配置;

 具体原理参考文章:  Spring MVC 3 深入总结

 web.xml配置文件如下:

复制代码
 
      <servlet>
        <servlet-name>SpringDispatcherServletservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
          <param-name>contextConfigLocationparam-name>
          
          <param-value>/WEB-INF/spring/servlet-context.xmlparam-value>
        init-param>
        
        <load-on-startup>1load-on-startup>
      servlet>
      
      <servlet-mapping>
        <servlet-name>SpringDispatcherServletservlet-name>  
         
        <url-pattern>/url-pattern>
      servlet-mapping>
复制代码

其中**.xml 这里可以使用多种写法
1、不写,使用默认值:/WEB-INF/-servlet.xml
2、/WEB-INF/classes/spring/servlet-context.xml
3、classpath*:/spring/servlet-context.xml
4、多个值用逗号分隔

Spring MVC 映射配置拦截器 无法访问静态的文件,如jpg,js,css等,主要采用:激活Tomcat的defaultServlet来处理静态文件的方法;其中 Tomcat, Jetty, JBoss, and GlassFish  默认 Servlet的名字 -- "default"

因此静态文件的拦截器,要写在DispatcherServlet的前面, 让 defaultServlet先拦截,这个就不会进入Spring了,性能最佳;

在web.xml中加配置如下:

复制代码
 
      <servlet>
        <servlet-name>SpringDispatcherServletservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
          <param-name>contextConfigLocationparam-name>
          
          <param-value>/WEB-INF/spring/servlet-context.xmlparam-value>
        init-param>
        
        <load-on-startup>1load-on-startup>
      servlet>
      
      <servlet-mapping>
        <servlet-name>SpringDispatcherServletservlet-name>  
         
        <url-pattern>/url-pattern>
      servlet-mapping>
复制代码

 其中springmvc配置文件:servlet-context.xml主要内容如下:

复制代码

    <context:component-scan base-package="com.springmvc.controller.**" />
      
    <mvc:annotation-driven />
     
    <mvc:default-servlet-handler/>
     
    <mvc:interceptors>
        
        <bean class="com.springmvc.common.controller.AuthenticationInerceptor">
            
           <property name="fileUri" value="${file_uri}">property>
        bean>
    mvc:interceptors>
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/" />
        <property name="suffix" value=".jsp" />
        <property name="order" value="2" />
    bean>
复制代码

解释如下:

1. 扫描指定的包中的类上的注解,常用的注解有:

 @Controller 声明Action组件
@Service    声明Service组件    @Service("myMovieLister") 
@Repository 声明Dao组件
@Component   泛指组件, 当不好归类时. 
@RequestMapping("/menu")  请求映射
@Resource  用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName") 
@Autowired 用于注入,(srping提供的) 默认按类型装配 
@Transactional( rollbackFor={Exception.class}) 事务管理
@ResponseBody
@Scope("prototype")   设定bean的作用域

2. 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)

3.拦截器

4. 使用默认的Servlet来响应静态文件

二.加入拦截器;

 在servlet-context.xml中加拦截器配置文件

复制代码
 
    <mvc:interceptors>
        
        <bean class="com.springmvc.common.controller.AuthenticationInerceptor">
            
           <property name="fileUri" value="${file_uri}">property>
        bean>
    mvc:interceptors>
复制代码

 具体拦截器类内容见文件:com.springmvc.common.controller.AuthenticationInerceptor

 拦截器原理以及参考文章见:SpringMVC中使用Interceptor拦截器

三.加入spring 业务层+加入mybatis 

1.在上下文配置文件applicationContext.xml中,加入spring封装业务层的配置文件;

 
      
      
      <import resource="classpath*:spring/spring-service-*.xml"/>

 2.spring封装业务层配置文件如下:

复制代码

    <context:component-scan base-package="com.springmvc.service" />
    
    <context:component-scan base-package="com.springmvc.dao" />
    
    <context:component-scan base-package="com.springmvc.redis" />
    
    <bean class="com.springmvc.common.util.SpringContextHolder">bean>
    
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="order" value="2" />
        <property name="ignoreUnresolvablePlaceholders" value="true" />
        <property name="locations">
            <list>
                <value>classpath:config.propertiesvalue>
            list>
        property>
    bean>
    
    <bean id="taskExecutor"
        class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="${threadpool.coreSize}" />
        <property name="keepAliveSeconds" value="200" />
        <property name="maxPoolSize" value="${threadpool.maxSize}" />
    bean>
    
    <import resource="classpath*:spring/spring-pms-transaction.xml"/>
    
    <import resource="classpath*:spring/spring-pms-redis.xml"/>
    
    <import resource="classpath*:spring/service-*.xml"/>
复制代码

解释如下:

    扫描该serivce层需要引用的所有:dao层,redis层

    这里没有扫描model层,是因为在mybatis的配置里,指定model层,和对应mapper.xml的位置;

   spring上下文持有器,可以在该层取到:ApplicaitonContext,这样可以取得spring管理的bean;

   读取.property配置文件,必须的,可以设置多个;

     多线程,线程池的配置

     具体的实现可参考:使用SPRING中的线程池ThreadPoolTaskExecutor实现JAVA并发

   引入其他层的配置文件

注意:classpath*:与classpath:的区别:classpath:只会到你的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找.

        具体的参考:web.xml 配置中classpath: 与classpath*:的区别

3.加入mybatis,事务处理配置文件spring-transaction.xml如下:

  mybatis以及事务处理的配置文件

 springmvc+spring-security+mybatis +redis 框架抽取_第2张图片

4.dao与mapper的指定在AbstractDAO类的构造函数中,通过命名空间来指定对应的mapper文件,从而取得里面的sql.具体的需要见代码
复制代码
public AbstractDAO() {
        @SuppressWarnings("rawtypes")
        Class c = getClass();
        Type type = c.getGenericSuperclass();
        if (type instanceof ParameterizedType) {
            Type[] parameterizedType = ((ParameterizedType) type)
                    .getActualTypeArguments();
            this.entityClass = (Class) parameterizedType[0];
            nameSpace = entityClass.getCanonicalName();
        }
    }
复制代码

四.加入redis;

对应包:jedis-2.0.0.jar,在service层调用redis,这个后续补充

复制代码
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="com.springmvc.redis" />

    
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="order" value="2" />
        <property name="ignoreUnresolvablePlaceholders" value="true" />
        <property name="locations">
            <list>
                <value>classpath:redis.propertiesvalue>
            list>
        property>
    bean>
    
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxActive" value="${redis.maxActive}" />
        <property name="maxIdle" value="${redis.maxIdle}" />
        <property name="maxWait" value="${redis.maxWait}" />
        <property name="testOnBorrow" value="false" />
    bean>
    
    
    <bean id="jedisShardInfo" class="redis.clients.jedis.JedisShardInfo">
        <constructor-arg index="0" value="${redis.host}" /> 
        <constructor-arg index="1" value="${redis.port}" /> 
        <constructor-arg index="2" value="${redis.timeout}" /> 
    bean>
    
    
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
        <property name="usePool" value="true"/>
        <property name="poolConfig" ref="jedisPoolConfig"/>
        <property name="shardInfo" ref="jedisShardInfo"/>
    bean>

    
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
        <property name="keySerializer">  
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer">bean>  
          property>
          <property name="valueSerializer">  
          <bean class="com.springmvc.common.redis.Object2StringRedisSerializer">bean>  
          property>
          <property name="hashKeySerializer">  
          <bean class="org.springframework.data.redis.serializer.StringRedisSerializer">bean>  
          property>
          <property name="hashValueSerializer">  
          <bean class="com.springmvc.common.redis.Object2StringRedisSerializer">bean>  
          property>
    bean>
    
beans>
复制代码

 四.加入spring-security;

参考文章:Spring安全权限管理(Spring Security的配置使用)

主要引用jar包:spring-security-cas-3.1.4.RELEASE.jar;

spring-security-config-3.1.4.RELEASE.jar;

spring-security-core-3.1.4.RELEASE.jar;

spring-security-crypto-3.1.4.RELEASE.jar;

spring-security-taglibs-3.1.4.RELEASE.jar;

spring-security-web-3.1.4.RELEASE.jar;

1.在上下文文件:applicationContext.xml 中加入配置:


     <context:component-scan base-package="com.springmvc.security" />
      
     <import resource="spring/spring-security.xml" />  

2.在web.xml中加入spring-security的过滤器和监听器:

复制代码

    <filter>
        <filter-name>springSecurityFilterChainfilter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
    filter> 
    <filter-mapping>
      <filter-name>springSecurityFilterChainfilter-name>
      <url-pattern>/*url-pattern>
    filter-mapping>
    
    <listener>
      <listener-class>org.springframework.security.web.session.HttpSessionEventPublisherlistener-class>
    listener>
复制代码

3.spring-security自身的配置文件:spring-security.xml的内容如下:

复制代码
xml verssion="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-3.1.xsd">
    
    <http pattern="/css/**" security="none"/>
    <http pattern="/js/**" security="none"/>
    <http pattern="/images/**" security="none"/>
      <http pattern="/login.jsp*" security="none"/>      

      <http auto-config="true" access-denied-page="/noauth.jsp">
        <intercept-url pattern="/**" access="ROLE_COMPANY" />
        <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1" default-target-url="/test/list"/>
        <custom-filter before="FILTER_SECURITY_INTERCEPTOR" ref="customFilter" />
      http>
      
      <beans:bean id="customFilter"
        class="com.springmvc.security.SecurityInterceptor">
        <beans:property name="authenticationManager" ref="authenticationManager"/>
        <beans:property name="accessDecisionManager" ref="accessDecisionManager" />  
        <beans:property name="securityMetadataSource" ref="customSecurityMetadataSource" />  
      beans:bean>
      <beans:bean id="customSecurityMetadataSource"
        class="com.springmvc.security.SecurityMetadataSource">
      beans:bean>
      <beans:bean id="accessDecisionManager" class="com.springmvc.security.RoleAccessDecisionManager">
    beans:bean>
    <beans:bean id="userDetailServiceImpl" class="com.springmvc.security.UserDetailServiceImpl">
    beans:bean>
    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref='userDetailServiceImpl'>
            <password-encoder hash="md5"/>
        authentication-provider>
      authentication-manager>
beans:beans>
复制代码

 spring-security.xml 中提到的实体类和引用的jar包分别如下:

  springmvc+spring-security+mybatis +redis 框架抽取_第3张图片    springmvc+spring-security+mybatis +redis 框架抽取_第4张图片

五。加入freemarker

涉及到的引用包为:freemarker-2.3.15.jar; jstl.jar

其中 freemarker 配置信息写在freemarker.xml中,然后将该文件import到servlet-context.xml(springMVC的配置文件)中,

freemarker.xml 指定了freemarker对应html的存放路径:

springmvc+spring-security+mybatis +redis 框架抽取_第5张图片

具体的见,自己写的文档:spring mvc中使用freemark的一点心得

六.加入freemarker里的国际化

 参考文章:SpringMVC学习系列(8) 之 国际化 

SpringMVC + FreeMarker 国际化使用方法

1.配置xml文件

复制代码

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
     
    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> 
     
    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>/WEB-INF/message/messagesvalue>
            list>
        property>
        <property name="cacheSeconds" value="0" />
    bean>
复制代码

注意事项:1.basenames里的springmvc+spring-security+mybatis +redis 框架抽取_第6张图片

     如果资源文件名为 test_zh_CN.properties,则该处改为:/WEB-INF/message/test

2.引入spring.ftl文件,该文件在:spring-webmvc-3.2.6.RELEASE.jar\org\springframework\web\servlet\view\freemarker\下

复制到springmvc+spring-security+mybatis +redis 框架抽取_第7张图片

3.在html里import 该spring.ftl,如上图:testList.html中引用:

  import的路径,是以freemark设置的默认路径为参照,因为该freemark路径是template,所以这里import路径如上图

 4.通过来java设置采用哪种语言  

//设置为英文格式化,到messages_en.properties 文件里去找
        request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("en"));
        //设置为中文格式化,到messages_zh_CN.properties 文件里去找
        request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("zh", "CN"));
        // 根据properties文件的编码,取对应的中英文内容;
        String msg=HttpUtil.getMessage(request, "tab.all");

另,在代码中根据资源文件的编码,取对应的中英文内容: HttpUtil.getMessage(request, "tab.all");

七.封装自定义控件;

 见自己写的 用freemarker定义宏实现自定义公用控件

 调用的时候,只需要把控件的html 给 include 进去就可以了,具体的如下图:

springmvc+spring-security+mybatis +redis 框架抽取_第8张图片

八.Spring事件监听器与异步机制

 参考:spring发布和接收定制的事件(spring事件传播)

1.事件:TestTaskEvent 继承 ApplicationEvent,具体的见代码

2.监听器:TestListener 实现接口 ApplicationListener,具体的见代码

3.发布:SpringContextHolder 实现接口 ApplicationContextAware, ServletContextAware,具体的见代码,并确保有spring应用上下文持有器

调用代码:

复制代码
    @Override
    public void testEvent() {
        // 发布事件
        System.out.println("我要发布信息。。。。。。。。");
        Map map=new HashMap();
        map.put("a1", "a1");
        TestTaskEvent event = new TestTaskEvent(map);
        SpringContextHolder.getApplicationContext().publishEvent(event);
    }
复制代码

测试结果:

 springmvc+spring-security+mybatis +redis 框架抽取_第9张图片

注意:很多文章里写的在配置文件xml中注入TestListener,这里使用了springMVC的自动扫描

1.在配置文件中配置Event和Listener的扫描路径;


    <context:component-scan base-package="com.springmvc.event" />
    <context:component-scan base-package="com.springmvc.listener" />

2.发布,必须确保spring-service-s1.xml中有配置:

   
   

3.在TestListener 实现类上加:@Service

九.定时器任务调度Quartz

参考文档:SpringMVC整合Quartz实现定时任务和Spring自带Task定时任务 

框架Quart在Java中任务调度的使用
主要引用jar包:quartz-all-1.8.6.jar

Quartz核心的概念:scheduler任务调度、Job任务、Trigger触发器、JobDetail任务细节

scheduler任务调度:触发器工程,将所有定时任务都注入工厂;(在配置文件job-scheduler.xml中设置)

Job任务:其实Job是接口,其中只有一个execute方法,我们开发者只要实现此接口,实现execute方法即可。把我们想做的事情,在execute中执行即可;

(TestJob.java,配置文件job-scheduler.xml中也有指向该类)

JobDetail:任务细节,Quartz执行Job时,需要新建个Job实例,但是不能直接操作Job类,所以通过JobDetail来获取Job的名称、描述信息

(在配置文件job-scheduler.xml中设置)

Trigger触发器:执行任务的规则;比如每天,每小时等。指定JobDetail和执行规则;(在配置文件job-scheduler.xml中设置)

 配置文件job-scheduler.xml如下文

复制代码
 
    <import resource="classpath*:spring/spring-service-*.xml"/>
    
    <context:component-scan base-package="com.springmvc.quartz.job.test.**" />
    
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="order" value="2" />
        <property name="ignoreUnresolvablePlaceholders" value="true" />
        <property name="locations">
            <list>
                <value>classpath:cron.propertiesvalue>
            list>
        property>
    bean>

    
    <bean name="quartzScheduler"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        
        
        
        
        
        
        <property name="triggers">
            <list>
                
                <ref bean="triggerTest" /> 
            list>
        property>
    bean>
    
    
    <bean id="triggerTest" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="jobDetailTest" />
        <property name="cronExpression" value="${quartz.test.minute}" />
    bean>
    
    
    <bean id="jobDetailTest" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
           <ref bean="jobTest"/>
        property>
        <property name="targetMethod">
            <value>executevalue>
        property>
         
        <property name="concurrent">  
            <value>falsevalue>  
        property> 
    bean>
    
       <bean id="jobTest" class="com.springmvc.quartz.job.test.TestJob">
    bean>
复制代码

 其中测试调用代码如下:选中该文件中的函数main,右键弹框--> Run As --> java application 进行测试

public class ServerMain {
    public static void main(String[] args) {
        RPCServer server = new RPCServer("spring/job-scheduler.xml");
        server.start();
    }
}

 运行结果如下:

17:10:00,002 INFO  [TestJob] springmvc-test:数据定时器,启动。。。。
17:10:00,002 INFO  [TestJob] springmvc-test:数据定时器:print users.开始。。。。

34009677

34009721

34009635

34009633

17:10:00,075 INFO  [TestJob] springmvc-test:数据定时器:print users.结束。。。。
17:10:00,075 INFO  [TestJob] springmvc-test:数据定时器,结束。。。。

添加packing-build.xml文件,指定打包内容

复制代码


default="dir">
    
    
    
        
        
            
        
        
        
            
        
        
        
            
            
        
        
        
        
            
        
        
        
        
        
            
        
        
        
        
        
            
        
        
        
        
        
                                            
        
        
        

        
        
                                            
        
        
        
        

        
    
复制代码

在execute文件夹下,加start.bat文件;修改该文件,指向测试用的 ServerMain文件

springmvc+spring-security+mybatis +redis 框架抽取_第10张图片

用Ant发布:windows--> show view -->Ant,弹出小蚂蚁窗口。在Ant窗口中,右键--> add BuildFiles...选中该项目的packing-build.xml后,如下:

选中该项目,右键 --->Run As  --->Ant Build,则将该工程发布到指定的路径下:

springmvc+spring-security+mybatis +redis 框架抽取_第11张图片

十.日志文件

参考文档:基础内容见:java日志文件log4j.properties配置详解  以及 Log4J日志配置详解

其中日志文件的扩展类实现见:扩展log4j系列[一]为DailyRollingFileAppender加上maxBackupIndex属性  与我们系统中的扩展类 :DailyMaxRollingFileAppender相对应

  Log4j – 如何配置多个logger?

 主要引用jar包:log4j-1.2.17.jar;

 slf4j-api-1.7.5.jar ;
slf4j-log4j12-1.7.5.jar

springmvc+spring-security+mybatis +redis 框架抽取_第12张图片

 其中日志文件配置如下:

复制代码
log4j.rootLogger=INFO,CONSOLE,FILE,useraction
#输出到控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{1}] %m%n
#输出到file,也就是logger的输出
log4j.appender.FILE=org.apache.log4j.DailyMaxRollingFileAppender
log4j.appender.FILE.threshold=DEBUG
log4j.appender.FILE.DatePattern='.'yyyy-MM-dd
log4j.appender.FILE.maxBackupIndex=10
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d - %-5p %C.%M(%F:%L) - %m%n
#日志文件后追加,以免覆盖原来的文件
log4j.appender.FILE.append=true
log4j.appender.FILE.file=${catalina.home}/logs/springmvc_test.log
log4j.appender.FILE.bufferedIO=false
#输出到useraction,用户操作日志,以loggerUserAction输出到另一个文件中
log4j.logger.useraction= DEBUG, useractionfile
log4j.additivity.useraction = false
log4j.appender.useractionfile=org.apache.log4j.DailyMaxRollingFileAppender
log4j.appender.useractionfile.threshold=DEBUG
log4j.appender.useractionfile.DatePattern='.'yyyy-MM-dd
log4j.appender.useractionfile.maxBackupIndex=10
log4j.appender.useractionfile.layout=org.apache.log4j.PatternLayout
log4j.appender.useractionfile.layout.ConversionPattern=%d - %-5p %C.%M(%F:%L) - %m%n
log4j.appender.useractionfile.append=true
log4j.appender.useractionfile.file=${catalina.home}/logs/springmvc_action.log
log4j.appender.useractionfile.bufferedIO=false
#com.springmvc架包下设置为debug
log4j.category.com.springmvc = DEBUG
log4j.category.java.sql = DEBUG
复制代码

 其中java代码调用:

复制代码
//应用系统的日志
protected final Log logger = LogFactory.getLog(getClass());
//用户操作日志
protected final Log loggerUserAction = LogFactory.getLog("useraction");

logger.info("write to file springmvc_test.log");
loggerUserAction.info("write to file springmvc_userAction.log");
复制代码

结果如下:

十一.手机客户端接口开发

 

十二.CAS

 

十三.搜索引擎

 

十四。zookeeper+dubbo

参考文档:Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

 1.设置启动zookeeper:在zookeeper-3.4.4/conf/zoo.cfg中 配置 zookeeper的端口:clientPort=2088;启动zookeeper-3.4.4/bin/zkServer.cmd 成功启动zookeeper服务;

 

十五.RPC实现及其接口(Provider角色)

 引入.jar包:dubbo-2.5.3.jar;

 netty-3.2.7.Final.jar;

 zkclient-0.2.dev.jar;  javassist-3.17.1-GA.jar;

 zookeeper-3.4.4.jar; RPC工程布局如下:

springmvc+spring-security+mybatis +redis 框架抽取_第13张图片

 在工程SpringMVC_RPC.API中放对外公开的接口:com.springmvc.rpc.api,以及接口返回字段的接收对象com.springmvc.rpc.model 以方便其他工程调用;如果其他工程想调用该RPC只需要引用该接口工程即可;

在工程SpringMVC_RPC.Impl 用于接口的实现,这里包括service,dao,mapper.xml以及相关的配置文件;其中service层到mapper.xml的配置如有问题,

参考:三.加入spring 业务层+加入mybatis;其中主要要注意的是spring-transaction.xml中mybatis的配置注意:

springmvc+spring-security+mybatis +redis 框架抽取_第14张图片

 其中dubbo应用RPC提供方的配置文件如下:

复制代码
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        ">

    
    <dubbo:application name="rpcApi" />
    
    <dubbo:registry address="zookeeper://127.0.0.1:2088" />
    
    <dubbo:protocol name="dubbo" port="2066" host="127.0.0.1" />
    
    <dubbo:service interface="com.springmvc.rpc.api.ITestApi" ref="testApi"/>
    <bean id="testApi" class="com.springmvc.rpc.impl.TestApiImpl" />     
    
beans>
复制代码

 RPC应用调用方的配置文件如下:

复制代码
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    
    <dubbo:reference id="testApi" interface="com.springmvc.rpc.api.ITestApi" check="false"/> 
   
beans>
复制代码

 注:dubbo-rpc.xml文件放在接口工程中,RPC本身的启动,不会读取该文件,主要是提供给调用方,也就是consumer使用,下文在portal中调用RPC接口;

接口实现端单元测试:

复制代码
@ContextConfiguration(locations = { "classpath:spring/spring-rpc.xml" })
public class TestApi extends AbstractJUnit4SpringContextTests{
    
    @Autowired
    ITestApi testApi;
    
    @Test
    public void getByUsername() throws ParseException {
        RPCUsers rpcUser= testApi.getByUsername("34004198");
        System.out.println("rpcUser="+JacksonMapper.toString(rpcUser));
    }
    }
复制代码

 

十六.web中调用RPC接口服务(Comsumer角色)

 在SpringMVC_Controller中调用RPC服务

1.controller工程中引用接口工程:SpringMVC_RPC.API

2.指定对应的zookeeper以及扫描相应接口端提供的dubbo-rpc.xml文件

在spring的上下文配置文件中引用接口配置文件,在applicationContext.xml中加以下内容

springmvc+spring-security+mybatis +redis 框架抽取_第15张图片

 3.在dubbo-consumer-api.xml中配置调用RPC,比如dubbo_consumer的定义,指定的zookeeper,以及调用的接口testAPI等,具体见配置文件

复制代码
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

     
    <dubbo:application name="RPC_dubbo_Consumer"/>
    
    <dubbo:registry address="zookeeper://192.168.1.156:2088" />
    
    <import resource="classpath*:spring/dubbo-*.xml"/>
beans>
复制代码

其中, 能扫描到SpringMVC_RPC.API中的spring/dubbo-rpc.xml

4.java代码的调用:

复制代码
    @Autowired
    @Qualifier("testApi")
    ITestApi testApi; 

/**
     * 测试RPC及其接口
     * @param request
     * @param response
     * @param map
     * @return
     */
    @RequestMapping(value = "/testApi")
    @ResponseBody
    public ModelAndView testApi(HttpServletRequest request, HttpServletResponse response, ModelMap map){
        map.put("controllerUri", "http://127.0.0.1:8080/springmvc");
        RPCUsers u= testApi.getByUsername("34004198");
        map.put("searchText", "测试RPC及其接口:"+JacksonMapper.toString(u));
        return new ModelAndView("/test/testList", map);
    }
复制代码

其中:ITestApi 和 RPCUsers都是 SpringMVC_RPC.API中的类

结果如下:

springmvc+spring-security+mybatis +redis 框架抽取_第16张图片

你可能感兴趣的:(springmvc+spring-security+mybatis +redis 框架抽取)