谷粒商城项目笔记(二)
作者:互联网
前后端分离
谷粒商城是前后端分离的结构。----------前端模块已经是写好的项目
—做后端的我们一般用不到,不过界面和后端代码连接的方法名有问题可以在这里改,改前端的信息。
src文件目录:
其中,api是异步服务调用的地址,views是页面数据属性的封装。
这个路径下修改某些方法名:
分布式架构
gmall-user项目中所有的controller、service接口、service实现都在一个工程,通过Spring的ioc就可以实现互相调用。
随着架构不断增大,服务节点也越来越多,服务之间的调用和依赖关系也越来越复杂,
需要有一个统一的中心来调度、路由、管理所有的服务,基于这个中心构建的这个星型架构就是现在目前最主流的SOA分布式架构。
整体以maven为基础,对项目进行分层架构。
为了实现这种SOA分布式架构,我们将整个项目按照下面的文件布局进行搭建。
使用maven依赖将这些接口作为公共的包进行管理,同时统一管理实体bean类。
以使得多个订单都可以来调用service接口。
使得service和web都依赖于interface并依赖于bean并依赖于通用Mapper。
module | 内容 |
---|---|
gmall-api | 存放实体bean类和service接口 |
搭建过程
1、gmall- parent 父依赖的创建
maven的概念。可以让所有的模块都继承这个parent模块,由这个parent模块来管理版本。
1、使用maven创建一个gmall-parent的工程,这个工程里面没有java代码,只有pom依赖。
2、使得其他子项目都继承自gmall-parent
3、原本的parent工程中springboot版本是2.3.4,结果导致版本号不匹配,改回了1.5.21
4、在gmall-parent中定义好项目的各种技术框架的各种版本。在pom.xml中进行定义,其他子项目也在pom依赖中继承
pom.xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 把这个位置springboot版本号改成1.5.21 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.21.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<fastjson.version>1.2.46</fastjson.version>
<dubbo-starter.version>1.0.10</dubbo-starter.version>
<dubbo.version>2.6.0</dubbo.version>
<zkclient.version>0.10</zkclient.version>
<mybatis.version>1.3.1</mybatis.version>
<nekohtml.version>1.9.20</nekohtml.version>
<xml-apis.version>1.4.01</xml-apis.version>
<batik-ext.version>1.9.1</batik-ext.version>
<jsoup.version>1.11.2</jsoup.version>
<httpclient.version>4.5.5</httpclient.version>
<commons-lang3.version>3.7</commons-lang3.version>
<mapper-starter.version>1.2.3</mapper-starter.version>
<jedis.version>2.9.0</jedis.version>
<jest.version>5.3.3</jest.version>
<jna.version>4.5.1</jna.version>
<beanUtils.version>1.9.3</beanUtils.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
<!-- 这里出现错误,出现springboot和dubbo的版本号问题 -->
<!-- 注释掉原有的版本号:<version>${dubbo-starter.version}</version> -->
<!-- 排除第三方版本号 ,不是问题的源头-->
<dependency>
<groupId>com.gitee.reger</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>${dubbo-starter.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>${nekohtml.version}</version>
</dependency>
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>${xml-apis.version}</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-ext</artifactId>
<version>${batik-ext.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>${jsoup.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${mapper-starter.version}</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.searchbox/jest -->
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>${jest.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>${jna.version}</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>${beanUtils.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2、gmall-api工程的创建
1、使用maven创建一个gmall-api工程,负责管理项目中所有的接口和实体bean类
2、在api工程的pom依赖中引入tk通用mapper映射类
3、文件结构包括bean类文件夹和Service文件夹存放所有的XXXService接口
4、将之前的所有的引入bean的文件引入路径都改为api文件目录下,包括 service、service实现、controller、mapper、mapper.xml
pom.xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-api</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
3、gmall-common-util工程的创建
所有的第三方依赖包分为三种:
1、 web业务模块用到的第三方包,比如文件上传客户端、页面渲染工具、操作cookie的工具类等等。
2、 service业务模块用到的第三方包,比如jdbc、mybatis、jedis、activemq工具包等等。
3、 通用型的第三方包,比如fastjson、httpclient、apache工具包等等。
4、 只有本模块用到的 es
工程旨在创建一个项目中的通用框架,是所有的应用工程需要引入的包
在pom依赖中进行修改,包括springboot、common-langs、common-beanutils
pom.xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>gmall-parent</artifactId>
<groupId>com.atguigu.gmall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-common-util</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.gitee.reger</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
</dependency>
</dependencies>
</project>
同时,基于SOA的架构理念,util设置也拆分为web前端Controller(webutil)和web后端Service(serviceutil)
分别新建gmall-web-util工程和gmall-service-util工程。
gmall-web-util工程加入前端包括Jsp、thymeleaf、cookie工具类,并依赖于gmall-common-util。
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>gmall-parent</artifactId>
<groupId>com.atguigu.gmall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-web-util</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-common-util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
</project>
gmall-service-util工程加入数据库等包括Mybatis、mysql、redis等,并依赖于gmall-common-util。
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>gmall-parent</artifactId>
<groupId>com.atguigu.gmall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-service-util</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-common-util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
</dependencies>
</project>
4、前后端分离
1、新建一个web的前端controller模块的项目
Controller = parent + api + webUtil
2、新建一个web的后端service模块的项目
service = parent + api + serviceUtil
基于dubbo的SOA面向服务
1 dubbo的soa的工作原理,和springcloud类似
2 dubbo和springcloud的区别在于dubbo由自己的dubbo协议通讯,sc是由http协议(rest风格)
3 dubbo有一个注册中心的客户端在时时同步注册中心的服务信息
4 dubbo有一个javaweb的监控中心,负责监控服务的注册信息,甚至可以配置负载均衡
dubbo其实是一组jar包,通过maven引入就可以,在linux中安装admin可视化管理平台。
zookeeper是一个开源的服务软件,需要安装到linux中。
在虚拟机中进行注册中心zookeeper和dubbo-admin管理平台的安装配置:
1、ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。
它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
2、Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。
从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。关于注册中心、协议支持、服务监控等内容。
将项目改造成dubbo的分布式架构
1、将gmall-user项目拆分成gmall-user-service和gmall-user-web两个项目
将controller文件夹放入前端gmall-user-web项目中
将通用mapper接口文件夹和服务实现impl文件夹放入gmall-user-service项目中
2、将dubbo框架引入到common-util中,然后gmall-service-util和gmall-web-util又依赖于gmall-common-util
3、记得刷新maven依赖
4、在客户端即UserController文件中使用@Reference代替@Autowired
---import com.alibaba.dubbo.config.annotation.Reference;
在服务端即实现类UserServiceImpl文件中增加@Service关键字
--import com.alibaba.dubbo.config.annotation.Service;
gmall-user-service项目的配置文件:
# 服务端口
server.port=8070
# jdbc
spring.datasource.password=82465
spring.datasource.username=root
spring.datasource.url=jdbc:mysql://localhost:3306/gmall_study?serverTimezone=UTC&characterEncoding=UTF-8
# mybtais配置
mybatis.mapper-locations=classpath:mapper/*Mapper.xml -------------------*/
mybatis.configuration.map-underscore-to-camel-case=true
# 解决问题:java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
mapper.identity=MYSQL
#修改日志级别------debug: 有的没的都打印
logging.level.root = info
## dubbo的配置
# dubbo中的服务名称
spring.dubbo.application=user-service
spring.dubbo.protocol.name=dubbo
# zookeeper注册中心的地址-------------
spring.dubbo.registry.address=192.168.199.129:2181
# zookeeper的通讯协议的名称
spring.dubbo.registry.protocol=zookeeper
# dubbo服务的扫描路径------------只到gmall路径,避免访问不当服务路径错误
spring.dubbo.base-package=com.atguigu.gmall
# dubbo 端口号: 53669
gmall-user-web的配置文件:
# 服务端口
server.port=8081
#修改日志级别------debug: 有的没的都打印
logging.level.root = info
# dubbo的配置
# dubbo中的服务名称
spring.dubbo.application=user-web
# dubbo的通讯协议名称
spring.dubbo.protocol.name=dubbo
# zookeeper注册中心的地址
spring.dubbo.registry.address=192.168.199.129:2181
# zookeeper的通讯协议的名称
spring.dubbo.registry.protocol=zookeeper
# dubbo的服务的扫描路径
spring.dubbo.base-package=com.atguigu.gmall
## dubbo的consumer在三秒钟之内每间隔一秒进行一次重新访问,默认一秒钟超时,
## 三次访问之后会直接抛超时异常,所以我们在开发阶段,可以将consumer设置的超时时间延长,方便断点调试
# 设置超时时间(默认是1000毫秒,改成600倍---十分钟)
spring.dubbo.consumer.timeout=600000
## consumer.check 是启动消费端时,是否检查服务端能否正常访问。
## 如果选择true,那启动消费端时,必须保证提供端服务正常,否则接口无法注入。
# 设置是否检查服务存在
spring.dubbo.consumer.check=false
dubbo
1 dubbo的基本概念
调用关系:
服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者(Consumer): 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
调用关系说明
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
标签:dubbo,服务,spring,boot,gmall,笔记,谷粒,com,商城 来源: https://blog.csdn.net/wang_chaochen/article/details/111132684