ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

谷粒商城项目笔记(二)

2020-12-15 17:32:36  阅读:204  来源: 互联网

标签:dubbo 服务 spring boot gmall 笔记 谷粒 com 商城


前后端分离

谷粒商城是前后端分离的结构。----------前端模块已经是写好的项目
—做后端的我们一般用不到,不过界面和后端代码连接的方法名有问题可以在这里改,改前端的信息。
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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有