学习品优购总结[一](分布式框架-Dubbox)

主要电商模式:

B2B2C模式,即:企业-企业-个人。
B2B2C是一种电子商务类型的网络购物商业模式,B是Business的简称,C是Customer的简称,第一个B指的是商品或服务的提供商,第二个B指的是从事电子商务的企业,C则是代表消费者。
任何的商品提供商或服务提供商都能可以成为第一个Business,第二个B是B2B2C模式的电子商务企业,C代表消费者,举例来说就是品牌卖家和销售平台,卖家把自己的品牌放在阿里、京东等平台上销售给我们。

项目简介

品优购网上商城主要分为网站前台、运营商后台、商家管理后台三个子系统。
网站前台:消费者。运营商后台:销售平台。商家管理后台:品牌卖家。

系统架构

系统架构是搭建项目的一种方式,比如分布式架构,微服务架构。
分布式是将一个项目,拆分成多个模块,比如解决一类业务的controller和service都是一个模块,每一个模块都可以单独作为一个服务,单独运行在一个tomcat中,占用一个端口。
SOA架构是Service-Oriented Architecture的首字母简称,支持面向服务的架构样式。说白了就是将项目一个个的业务功能拆分出来,以服务的形式提供出来,比如说每一个service层的实现类都是一个单独的服务,这样可以更好的去使用,每一类服务(模块)都会开启一个tomcat占用一个端口,SOA是分布式的解决方案之一。
集群是将一个分成各个单独模块的项目,部署到不同的服务器中,这些模块最终运行起来就是一个完成的项目。
分布式和集群可以一起使用。
品优购系统架构图

Dubbox

Dubbox、Dubbo和Spring could都是解决分布式架构的核心技术。
Dubbox是一个分布式服务框架,前身是阿里巴巴的开源项目Dubbo,简单来说Dubbox和Dubbo是同一个东西,这个框架可以很好的实现SOA这个解决方案,只有在分布式的时候才有Dubbox的需求。
Dubbox运行图节点角色说明:
Provider:服务提供方。Consumer:调用远程服务的服务消费方。Container:服务运行容器。
Registry:服务注册与发现服务中心。Monitor:统计服务的调用次调和调用时间的监控中心。
运行原理:
Controller(消费方)→ Service(服务提供方)
0 → 服务容器负责启动,加载,运行服务提供者。不同的模块和同种可以启动不同的tomcat将模块放入容器中作为提供者,不同的模块中每一个service实现类都单独开启一个服务,同种模块功能相同,避免模块挂掉而部署多个相同的模块。
1 →服务提供者在启动时,向注册中心注册自己提供的服务。tomcat启动时将每一个服务放在注册中心中。
2,3 → 服务消费者在启动时,向注册中心订阅自己所需的服务。 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。就是说消费者(Controller)无法直接访问Service,需要通过访问注册中心拿到service的地址再进行访问。
4 → 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。就是说拿到service的地址后会随机调用一个模块相同的服务地址,如果失败的话重新调用另一个同样模块的地址。
5 → 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。如果Controller对应的模块挂掉了,通过地址就访问不到service了,这时监听中心会检测到访问地址失败,会从注册中心中获取另一个同样模块的地址发送给此Controller继续访问。
问题:如果注册中心挂掉怎么办?
第一种情况:注册中心在所有tomcat启动之前直接挂掉,服务提供方无法将自己的访问地址交给注册中心,消费方永远拿不到地址,调用不了服务方。
第二种情况:注册中心一开始没挂掉,服务提供方将自己的地址交给消费方之后注册中心保存后才挂掉,消费方先拿到地址访问成功,这时注册中心挂掉,当在进行另一个操作时要进行第二次的访问,这时消费方依然可以通过缓存在本地的服务方地址进行消费,如果这时候服务也挂掉了,监测中心不能从挂掉的注册中心拿到地址,就访问不到了。

安装注册中心zookeeper(略)

Dubbo本身是一个jar包,没有注册中心。
Zookeeper:提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力小。
安装好后通过http://IP:PORT/dubbo名/访问

添加离线文档

1.打开设置File–>Settings(或者Ctrl + Alt + S)—>Languages&Frameworks–>Schemas and DTDS。
2.选择右上角的“+”进入添加界面 其中URI是你xml文件里引用该xsd文件的地址,File是你本地的xsd文件的所在目录。
作用:使用xml时,有提示功能。
配置离线约束,首先离线肯定是不联网的情况,在编写xml文件的时候,如果不连网,很多标签的提示都没有,要先在离线的情况下,也有xml文件的标签提示就需要配置离线约束。

项目工程搭建

1.工程结构说明:
pinyougou-parent → 聚合工程
pinyougou-pojo → 通用实体类层
pinyougou-dao → 通用数据访问层
pinyougou-xxxxx-interface → 某服务层接口
pinyougou-xxxxx-service → 某服务层实现
pinyougou-xxxxx-web → 某web工程

2.创建数据库表

3.父工程:
打包方式为pom

<dependencyManagement/>:子工程不可以继承父工程的依赖,需要自己引入。
<properties/>:集中定义依赖版本号,在子工程中不需要指定版本号,只需要引入依赖即可。
						eg:<properties>
       								<spring.version>4.2.4.RELEASE</spring.version>
       						</properties>
<version/>:指定版本号。eg:<version>${spring.version}</version>

4.dao:
依赖于pojo,打包方式:jar

5.serviceInterface:
依赖pojo,打包方式:jar

6.serviceImpl:
依赖dao和serviceInterface,打包方式:war
webapp/WEB-INF/web.xml:

<!-- 加载spring容器 -->
<context-param><param-name>contextConfigLocation</param-name>
		<param-value>classpath*:spring/applicationContext*.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
注:classpath*:所有路径下的包括依赖中的。
	applicationContext*.xml:以applicationContext开头的所有xml文件

applicationContext-service.xml :

<dubbo:protocol name="dubbo" port="20881"></dubbo:protocol> :标明Dubbo所在计算机的端口来提供服务,默认端口为20880.
<dubbo:application name="pinyougou-sellergoods-service"/>  :一般是工程名
<dubbo:registry address="zookeeper://192.168.25.129:2181"/>:zookeeper所在地址和端口
<dubbo:annotation package="com.pinyougou.sellergoods.service.impl" /> :在哪个包中生效

7.web:
依赖serviceInterface,打包方式:war
webapp/WEB-INF/web.xml:

<!-- 解决post乱码 -->
	<filter>
		<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>	
  	<servlet>
  		<servlet-name>springmvc</servlet-name>
  		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  		<!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
  		<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:spring/springmvc.xml</param-value>
  	</init-param>
 	 </servlet>
 		 <servlet-mapping>
  		<servlet-name>springmvc</servlet-name>
  		<!-- 所有的SpringMVC中的请求需要以.do结尾-->
  		<url-pattern>*.do</url-pattern>
 	 </servlet-mapping>

springmvc.xml :

	<mvc:annotation-driven>
	  <mvc:message-converters register-defaults="true">
	    <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">  
	      <property name="supportedMediaTypes" value="application/json"/>
	      <property name="features">
	        <array>
	          <value>WriteMapNullValue</value>
	          <value>WriteDateUseDateFormat</value>
	        </array>
	      </property>
	    </bean>
	  </mvc:message-converters>  
	</mvc:annotation-driven>
	<!-- 引用dubbo 服务,由于是消费方所以不用注册 -->
	<dubbo:application name="pinyougou-manager-web" /> :一般是工程名
	<dubbo:registry address="zookeeper://192.168.25.132:2181"/>:zookeeper所在地址和端口
	<dubbo:annotation package="com.pinyougou.manager.controller" />  :在哪个包中生效

@Reference:
在以前使用Spring扫描注解时,服务层都会加上org.springframework.stereotype.Service的@Service代表是本工程下的服务,但是现在服务不在本地而是通过注册中心来”分发“服务,那么不在本地的service怎么进入spring的管理呢?在之前实现类中配置过注册中心和Dubbo的地址,说明服务现在是在注册中心中的,那么现在就需要从注册中心拿到这个服务来消费,此时将原来的org.springframework.stereotype.Service中的@Service更改为com.alibaba.dubbo.config.annotation下的@Service表明是远程的Service,并且通过Spring对想要创建的对象进行管理和实例时,不再用@Autowire这种本地方式加载,想要创建实例需要在Controller的服务层接口上加上@Reference这样的远程实例,这样当进入Controller时,会通过@Reference从远程带有com.alibaba.dubbo.config.annotation的@Service中找到对应的服务来实例化对象。

常见错误

1.在注册中心找不到对应的服务

java.lang.IllegalStateException: Failed to check the status of the service 
com.pinyougou.sellergoods.service.BrandService. No provider available for the service 
com.pinyougou.sellergoods.service.BrandService from the url zookeeper://192.168.25.129:2181
com.alibaba.dubbo.registry.RegistryService?application=pinyougou-manager-web&dubbo=2.8.4&
interface=com.pinyougou.sellergoods.service.BrandService&
methods=update,get,delete,selectOptionList,add,getListByPage&
pid=3980&revision=0.0.1-SNAPSHOT&side=consumer&timestamp=1501146823396 to the consumer 172.16.17.14 use dubbo version 2.8.4

首先检查服务是否正常启动,其次还可能是服务层没有成功注册带注册中心,检查是否添加了com.alibaba.dubbo.config.annotation包的@Service注解。
2.无法连接到注册中心
org.I0Itec.zkclient.exception.ZkTimeoutException: Unable to connect to zookeeper server within timeout: 5000
org.I0Itec.zkclient.ZkClient.connect(ZkClient.java:876)
org.I0Itec.zkclient.ZkClient.(ZkClient.java:98)
org.I0Itec.zkclient.ZkClient.(ZkClient.java:92) org.I0Itec.zkclient.ZkClient.(ZkClient.java:80)
com.alibaba.dubbo.remoting.zookeeper.zkclient.ZkclientZookeeperClient.(ZkclientZookeeperClient.java:26)
检查IP与端口是否填写正确、注册中心是否正常启动。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值