服务消费者ivan-dubbo-web工程搭建,首先这是一个web工程,这里只存在Controller及前台view
1、在WEB_INF下新建文件夹views,并将自动生成的index.jsp,拖到views文件夹下,如上图;
2、pom.xml文件,这里依赖暴露的接口ivan-api及ivan-core工程:
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <span style="color:#FF9966;"><groupId>ivan</groupId>
- <artifactId>ivan-dubbo-web</artifactId></span>
- <packaging>war</packaging>
- <span style="color:#FF9966;"><version>0.0.1-SNAPSHOT</version>
- <name>ivan-dubbo-web Maven Webapp</name></span>
- <url>http://maven.apache.org</url>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>ivan</groupId>
- <artifactId>ivan-core</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>ivan</groupId>
- <artifactId>ivan-api</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
- </dependencies>
- <build>
- <finalName>ivan-dubbo-web</finalName>
- </build>
- </project>
3、web.xml,这里采用的web工程2.5版本,如果各位是2.3、3.0等,请百度修改xml文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="<span style="color:#FF0000;">2.5</span>"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_<span style="color:#FF0000;">2_5</span>.xsd">
- <display-name>ivan-dubbo-web</display-name>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring.xml</param-value>
- </context-param>
- <filter>
- <filter-name>encodingFilter</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
- <init-param>
- <param-name>forceEncoding</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>encodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <filter>
- <filter-name>hiddenHttpMethodFilter</filter-name>
- <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>hiddenHttpMethodFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <!-- 防止spring内存溢出监听器 -->
- <listener>
- <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
- </listener>
- <!-- 配置静态文件访问 -->
- <servlet-mapping>
- <servlet-name>default</servlet-name>
- <url-pattern>*.jpg</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>default</servlet-name>
- <url-pattern>*.png</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>default</servlet-name>
- <url-pattern>*.gif</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>default</servlet-name>
- <url-pattern>*.js</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>default</servlet-name>
- <url-pattern>*.css</url-pattern>
- </servlet-mapping>
- <!-- <servlet> <servlet-name>upload</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>upload</servlet-name>
- <url-pattern>/</url-pattern> </servlet-mapping> -->
- <servlet>
- <description>ivan-dubbo-web servlet</description>
- <servlet-name>rest</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>
- classpath:spring-mvc.xml
- </param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>rest</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
- <!-- 配置session超时时间,单位分钟 -->
- <session-config>
- <session-timeout>30</session-timeout>
- </session-config>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
4、spring.xml,主要阐述服务注册中心及服务暴露协议,这里为dubbo协议(这里引入的静态文件config.properties暂时没有用,可以注释掉):
- <?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"
- xmlns:context="http://www.springframework.org/schema/context"
- 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
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd">
- <!--引入配置属性文件 -->
- <context:property-placeholder location="classpath:config.properties" />
- <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
- <dubbo:application name="ivan-dubbo-web" />
- <!-- 使用zookeeper广播注册中心暴露服务地址 -->
- <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
- </beans>
5、spring-mvc.xml,这个大家应该都比较熟悉了,就是前台解析及bean的自动扫描(启动upload的配置暂时无用):
- <?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"
- xmlns:context="http://www.springframework.org/schema/context"
- 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
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd">
- <!--
- 自动扫描controller包下的所有类,如果@Controller注入为bean
- 并将bean依赖注入,即dubbo服务端暴露的Service注入到Controller中
- -->
- <dubbo:annotation package="com" />
- <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
- <bean id="mappingJacksonHttpMessageConverter"
- class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
- <property name="supportedMediaTypes">
- <list>
- <value>text/html;charset=UTF-8</value>
- </list>
- </property>
- </bean>
- <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
- <bean
- class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
- <property name="messageConverters">
- <list>
- <!-- json转换器 -->
- <ref bean="mappingJacksonHttpMessageConverter" />
- </list>
- </property>
- </bean>
- <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
- <bean
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="viewClass"
- value="org.springframework.web.servlet.view.JstlView" />
- <property name="prefix" value="/WEB-INF/views/" />
- <property name="suffix" value=".jsp" />
- </bean>
- <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->
- <bean id="multipartResolver"
- class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
- <property name="defaultEncoding" value="UTF-8" />
- <!-- 指定所上传文件的总大小不能超过200KB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
- <property name="maxUploadSize" value="200000" />
- </bean>
- <!-- SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException -->
- <!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 -->
- <bean id="exceptionResolver"
- class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
- <property name="exceptionMappings">
- <props>
- <!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 -->
- <prop
- key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload</prop>
- </props>
- </property>
- </bean>
- </beans>
6、log4j.properties
- ### set log levels ###
- log4j.rootLogger = INFO , C , D , E
- ### console ###
- log4j.appender.C = org.apache.log4j.ConsoleAppender
- log4j.appender.C.Target = System.out
- log4j.appender.C.layout = org.apache.log4j.PatternLayout
- log4j.appender.C.layout.ConversionPattern = [%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
- ### log file ###
- log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
- log4j.appender.D.File =../logs/IvaDubboWeb-info.log
- log4j.appender.D.Append = true
- log4j.appender.D.Threshold = INFO
- log4j.appender.D.layout = org.apache.log4j.PatternLayout
- log4j.appender.D.layout.ConversionPattern = [%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
- ### exception ###
- log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
- log4j.appender.E.File = ../logs/IvaDubboWeb-error.log
- log4j.appender.E.Append = true
- log4j.appender.E.Threshold = ERROR
- log4j.appender.E.layout = org.apache.log4j.PatternLayout
- log4j.appender.E.layout.ConversionPattern = [%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
7、创建UserController,并将ivan-api工程中的UserService依赖注入(注意:@Reference中若有其他属性,需与服务端的@Service完全对应。如:@Service(version="1.0.0"),消费者必须为@Reference(version="1.0.0"),否则是找不到服务的):
- import java.util.List;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- import com.alibaba.dubbo.config.annotation.Reference;
- import com.ivan.api.dubbo.UserService;
- import com.ivan.entity.User;
- @Controller
- @RequestMapping("/user")
- public class UserController {
- @SuppressWarnings("unused")
- private static final Logger logger = LoggerFactory.getLogger(UserController.class);
- @Reference
- private UserService userService;
- @RequestMapping("/")
- public String goIndex(){
- return "index";
- }
- @RequestMapping("/list")
- @ResponseBody
- public List<User> getUsers(){
- return userService.getUsers();
- }
- @RequestMapping("/one")
- @ResponseBody
- public User getUserById(){
- return userService.getUserByPrimaryKey("1");
- }
- }
至此,消费者已经搭建完成了,将工程发布到tomcat中,并启动(前提服务提供者即ivan-dubbo-server及注册中心zookeeper已经启动了),在浏览器中访问:http://127.0.0.1:8080/ivan-dubbo-web/user/list/ 或 http://127.0.0.1:8080/ivan-dubbo-web/user/one/
看到如下信息则表示搭建成功,并可以将测试添加多个注册中心,多个服务提供者的容灾了: