Easymall项目分布式拆分整合(四) 桃扇骨 2022-04-27 19:52 350阅读 0赞 # Easymall项目分布式拆分整合(四) # -------------------- **目录** Easymall项目分布式拆分整合(四) 一.前端系统的搭建开发 一.搭建 1.maven骨架webapp 2.pom文件修改 1.parent的继承 2.common的依赖(exclusions redis从common中传递过来) 3.处理jsp有效显示在springboot下的依赖支持 3.页面和静态文件的引入,删除index.jsp 1.最终在前端系统中的页面相关内容如下 2.创建文件夹src/main/java(src/test/java一并出现) 4.启动类(所有独立的系统中启动类扫描范围都是com.jt) 1.我这里依赖里面有个坑,浪费半个小时解决, 2.具体什么坑,留给有缘人.解决方案就不讲了,自行处理 3.坑,埋了之后运行,就不会报错了 5.编写application.properties配置文件 1.定义端口8091(8092 8093 8094 8095 8096 8097) 2.前端系统的页面跳转的前缀后缀 3.nginx高并发对前端集群的访问(nginx的根目录完成conf/nginx.conf编辑) 4.如下内容是在nginx.conf配置 5.hosts文件域名easymall绑定127.0.0.1 二.开发前端系统具体功能 2.1实现easymall前端系统的所有页面跳转功能(不带数据) 1.首页的访问 2.注册登录(page/login,page/regist) 3.后台商品首页(page/manage,page/item-list,page/item-edit等) 4.导入IndexController类 2.2完成首页全部商品分页查询 1.导入相关代码,从之前SSM项目,或者SpringBoot中获取 三.httpclient发起代码内容部的http请求. 3.1httpclient代码api 1.映入httpclient依赖,SpringBoot支持版本4.5.3 版本号可写可不写 2.做个测试类 四.实现前端系统的访问后台商品系统的过程(productService) 1.接口文件 2.解析字符串,创建一个工具类 3.创建一个ProductService 类,去访问 4.ProductService中调用httpClient改版. 5.准备一个httpclient连接使用的配置属性properties中 6.将两个配置相关的class引入web工程 1.HttpClient(配置类,实现各种对象创建各种属性读取) 2.HttpClientService(二次封装了CloseableHttpClient底层api) 3.HttpResult添加到当前common工程中 五.总结 -------------------- # **一.前端系统的搭建开发** # # 一.搭建 # ## **1.maven****骨****架webapp** ## ![20190610114200185.png][] ## 2.pom文件修改 ## ### 1.parent的继承 ### <parent> <groupId>cn.tedu</groupId> <artifactId>springboot-parent-easymall</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> ### 2.common的依赖(exclusions redis从common中传递过来) ### <dependency> <groupId>cn.tedu</groupId> <artifactId>springboot-common-easymall</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> ### 3.处理jsp有效显示在springboot下的依赖支持 ### **jstl,jasper(easymall工程提供)** <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> ## 3.页面和静态文件的引入,删除index.jsp ## **自动生成的index.jsp 存在的话,会默认读取** ![20190610113904483.png][] ### **1.最终在前端系统中的页面相关内容如下** ### ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70][] ### 2.创建文件夹src/main/java(src/test/java一并出现) ### ![20190610113953964.png][] ![20190610114014264.png][] ## 4.启动类(所有独立的系统中启动类扫描范围都是com.jt) ## ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 1][] ### 1.我这里依赖里面有个坑,浪费半个小时解决, ### ![20190610135728386.png][] ### 2.具体什么坑,留给有缘人.解决方案就不讲了,自行处理 ### ![20190610135831544.png][] ### 3.坑,埋了之后运行,就不会报错了 ### ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 2][] ## 5.编写application.properties配置文件 ## server.port=8091 spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp http.maxTotal = 100 http.defaultMaxPerRoute = 20 http.connectTimeout=1000 http.connectionRequestTimeout=500 http.socketTimeout=10000 http.staleConnectionCheckEnabled=true ### 1.定义端口8091(8092 8093 8094 8095 8096 8097) ### * **server.port=8091** ### 2.前端系统的页面跳转的前缀后缀 ### * spring.mvc.view.prefix=/WEB-INF/views/ * spring.mvc.view.suffix=.jsp ### 3.nginx高并发对前端集群的访问(nginx的根目录完成conf/nginx.conf编辑) ### **前端是启动一个不同****ip****和端口的集群** nginx配置访问前端的域名(www.easymall.com) server { listen 80; //端口 server_name www.easymall.com; //在hosts文件做映射 location /{ 高并发 proxy_pass http://easymall/ //虚拟域名 单节点转发 proxy_pass http://127.0.0.1:8093/ ### 4.如下内容是在nginx.conf配置 ### **\#easymall的前端系统访问** server { listen 80; server_name www.easymall.com; location / { proxy_pass http://127.0.0.1:8091; #proxy_pass http://jt_tomcats; proxy_connect_timeout 600; proxy_read_timeout 600;} } **打开配置文件并修改** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 3][] ### 5.hosts文件域名easymall绑定127.0.0.1 ### **1.C:\\Windows\\System32\\drivers\\etc 默认地址** ![20190610141643886.png][] **2. 127.0.0.1 [www.easymall.com][]** -------------------- # 二.开发前端系统具体功能 # ## 2.1实现easymall前端系统的所有页面跳转功能(不带数据) ## ### 1.首页的访问 ### ![20190610141925673.png][] * RequestMapping("/") * return "index" //前缀后缀拼接找到index.jsp ![20190610142000662.png][] **1.启动nginx,项目运行测试** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 4][] **2.直接输入域名,nginx进行转发** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 5][] ### 2.注册登录(page/login,page/regist) ### ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 6][] ### 3.后台商品首页(page/manage,page/item-list,page/item-edit等) ### ![20190610142552708.png][] **目前只能实现空数据,跳转** * RequestMapping("page/\{pageName\}") * return pageName; ### 4.导入IndexController类 ### **将easymall的springboot整合里的IndexController拷贝,修改成纵向拆分的包名结构com.jt.web.controller(com.jt.product.controller,com.jt.user.controller)** @Controller public class IndexController { @RequestMapping(value="/",method=RequestMethod.GET) public String goIndex() { return "index";//视图解析器,前缀,后缀的拼接 //最终页面响应的结果WEB-INF/views/index.jsp } //动态接收请求地址参数做页面跳转 @RequestMapping(value="page/{pageName}",method=RequestMethod.GET) public String goPage(@PathVariable String pageName){ return pageName; } } ## 2.2完成首页全部商品分页查询 ## ### 1.导入相关代码,从之前SSM项目,或者SpringBoot中获取 ### * 前端系统与前端页面之间的交互访问,已经在easymall实现了controller接收 从easymall中将ProductController粘贴到当前纵向拆分之后的web系统 * 之前easymall单体项目中的所有controller都早就定义好了和jsp页面和ajax调用的数据结构,所有controller无需修改方法 * 在web前端系统重新定义productServer,xxService们,在业务层中不能访问数据层,只能从后台各种服务系统中调用数据 * 修改ProductService中第一个方法,调用商品后台的返回数据 **代码就不沾了,需要去之前项目拷贝,或者去下载我上传的项目** # 三.httpclient发起代码内容部的http请求. # **http协议,不仅仅是浏览器可以支持(底层语言写),C,PHP,PYTHON,JAVA都支持各种各样封装了http协议的客户端代码,TransportClient就是底层封装了http协议的客户端,专门为es做的方法;** **需要使用一种可以在java代码中发起http请求的客户端--httpClient** ## 3.1httpclient代码api ## ### **1.映入httpclient依赖,SpringBoot支持版本4.5.3 版本号可写可不写** ### <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.3.5</version> </dependency> ### 2.做个测试类 ### **从test测试代码中访问** [https://blog.csdn.net/LiuY521/][https_blog.csdn.net_LiuY521] **代码** public class HttpTest { /* * 通过httpclient直接访问京东首页 * 从代码中发起请求,request对象准备 * 发送调用,之后接收response返回响应内容,我们只关心响应体 * 京东首页返回的响应体 */ @Test public void test01() throws Exception{ //获取一个httpclient的实现类客户端CloseableHttpClient CloseableHttpClient client = HttpClients.createDefault(); //相当于TransportClient意义一样的 //构造一个请求对象Request,定义了不同的请求方式对应不同的请求对象 HttpGet request=new HttpGet("https://blog.csdn.net/LiuY521/"); //client调用对象request发起请求,获取返回结果response CloseableHttpResponse response = client.execute(request); response.getAllHeaders(); response.getParams(); //关系响应体 HttpEntity entity = response.getEntity();//京东服务器返回的所有首页的响应体内容 //将entity解析成string System.out.println(EntityUtils.toString(entity)); //可以对其他系统返回的字符串数据解析使用 } } **测试结果** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 7][] **ps:可以获取相应体返回的数据,如果返回的是字符串,可以解析使用** # 四.实现前端系统的访问后台商品系统的过程(productService) # ## **1.接口文件** ## <table style="margin-left:.7083in;"> <tbody> <tr> <td style="border-color:#a3a3a3;vertical-align:top;width:1.0402in;"> <p style="margin-left:0in;">请求地址</p> </td> <td style="border-color:#a3a3a3;vertical-align:top;width:697px;"> <p style="margin-left:0in;"><a href="http://product.jt.com/product/queryByPage?page=1&rows=5" rel="nofollow">http://product.jt.com/product/queryByPage?page=1&rows=5</a></p> </td> </tr> <tr> <td style="border-color:#a3a3a3;vertical-align:top;width:1.0402in;"> <p style="margin-left:0in;">请求参数</p> </td> <td style="border-color:#a3a3a3;vertical-align:top;width:697px;"> <p style="margin-left:0in;">Integer page,Integer rows</p> </td> </tr> <tr> <td style="border-color:#a3a3a3;vertical-align:top;width:1.0402in;"> <p style="margin-left:0in;">请求方式</p> </td> <td style="border-color:#a3a3a3;vertical-align:top;width:697px;"> <p style="margin-left:0in;">get提交</p> </td> </tr> <tr> <td style="border-color:#a3a3a3;vertical-align:top;width:1.0402in;"> <p style="margin-left:0in;">相应数据</p> </td> <td style="border-color:#a3a3a3;vertical-align:top;width:697px;"> <p style="margin-left:0in;">Page对象,totalPage总页数,currentPage当前页数,products分页查询结果;</p> <p style="margin-left:0in;">{"total":56,"currentPage":2;"products":[{},{},{},{},{}]}</p> </td> </tr> </tbody> </table> ## **2.解析字符串,创建一个工具类** ## **在common中添加MapperUtils,管理系统调用的所有mapper对象** ** /\* ObjectMapper mapper = new ObjectMapper(); \* 每次解析json 都需要创建一个新的对象,浪费内存, \* 可以做一个静态的常量 \* 如果很多地方都在使用的话,可以定义一个静态类去封装 \*/ ** ![20190610151938511.png][] ## 3.创建一个**ProductService **类,去访问 ## @Service public class ProductService { public Page queryByPage(Integer currentPage, Integer rows) { //定义请求到后台的url地址,访问后台获取分页查询的各种数据返回 String url="http://product.easymall." + "com/product/queryByPage?page=" +currentPage+"&rows="+rows; //获取一个httpclient的实现类客户端CloseableHttpClient CloseableHttpClient client = HttpClients.createDefault(); //request对象 get请求 HttpGet request=new HttpGet(url); try{ //client调用对象request发起请求,获取返回结果response CloseableHttpResponse response = client.execute(request); //解析response,entity字符串 String jsonData=EntityUtils. toString(response.getEntity()); //jsonData={"total":56,"currentPage":2;"products":[{},{},{},{},{}]} Page page=MapperUtils.MP.readValue(jsonData, Page.class); return page; }catch(Exception e){ e.printStackTrace(); return null; } } } ## 4.ProductService中调用httpClient改版. ## **为了解决httpclient对象在代码中频繁创建和销毁,需要引入框架解决,让httpclient某个对象注入到业务层代码调用,并且也可以对httpclient底层api做二次封装** ## 5.准备一个httpclient连接使用的配置属性properties中 ## * **http.maxTotal = 100** * **http.defaultMaxPerRoute = 20** * **http.connectTimeout=1000** * **http.connectionRequestTimeout=500** * **http.socketTimeout=10000** * **http.staleConnectionCheckEnabled=true** **![20190610152520370.png][]** ## 6.将两个配置相关的class引入web工程 ## ### **1.HttpClient(配置类,实现各种对象创建各种属性读取)** ### ![20190610152825738.png][] ### **2.HttpClientService(二次封装了CloseableHttpClient底层api)** ### * doGet(url) * doGet(url,Map) * doPost(url) 返回的是一个VO模版对象HttpResult * doPost(url,Map) * doPostJson(url,json) ### 3.HttpResult添加到当前common工程中 ### ![20190610152838884.png][] **优化之后的代码** @Service public class ProductService { @Autowired private HttpClientService client; public Page queryByPage(Integer currentPage, Integer rows) { //定义请求到后台的url地址,访问后台获取分页查询的各种数据返回 String url="http://product.easymall." + "com/product/queryByPage?page=" +currentPage+"&rows="+rows; try{ String jsonData = client.doGet(url); Page page=MapperUtils.MP.readValue(jsonData, Page.class); return page; }catch(Exception e){ e.printStackTrace(); return null; } } } # 五.总结 # ![20190610153114858.png][] **目前Easymall分布式V1.0的三个模块已经配置好** * **1.Parent父工程主要是pom配置文件的,这里面的配置文件主要是所以模块都会使用到的依赖的封装,** * **2.common子工程主要是一些其他模块使用频繁的工具类,VO,pojo 封装,使用的时候依赖即可,无需重复创建** * **3.web子工程只要是负责前端系统的开发,纵向拆分,**不需要访问数据库,无法去后台之间获取数据 # **上传Easymall分布式V1.0项目** # ![20190610154222991.png][] c12089c92dec67d31478efbdb1e4a7c9 MD5加密了 密码 521125 [20190610114200185.png]: /images/20220121/3ff0711447c24571a0d678bddfb59d18.png [20190610113904483.png]: /images/20220121/e510b4cbe4ce4974b3a02698ce7dd28c.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70]: /images/20220121/618475af83dd4d0e8001b6aa789fafc5.png [20190610113953964.png]: /images/20220121/4f6f3dc1a5a14109a889a3df768d6ea5.png [20190610114014264.png]: /images/20220121/e6ccb031a9ca4296a9fd90755ded3a42.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 1]: /images/20220121/d06bf2f7b2424381bc01abd520e8a0be.png [20190610135728386.png]: /images/20220121/0acef71912c14e79a0b44cf826f4b87f.png [20190610135831544.png]: /images/20220121/f94e00dc0eed4b82808d8d2fdf291471.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 2]: /images/20220121/415a7964ab6d4160823c530954d4fc14.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 3]: /images/20220121/b4cb354418c44eb4b14585a2a21ce92a.png [20190610141643886.png]: /images/20220121/27027c03dcb7431c9926c47bddbca14f.png [www.easymall.com]: http://www.easymall.com [20190610141925673.png]: /images/20220121/1ca81f41ccee457ca78d80be078c2392.png [20190610142000662.png]: /images/20220121/682aa14f3bac4484af9cc29ec73fd3c3.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 4]: /images/20220121/382e54f4758d4b4da93eb18d80d5c9cc.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 5]: /images/20220121/1e42c1bafc4a460588eaf88d6d96c77e.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 6]: /images/20220121/c7b4c35867d5477089991f12cd756a12.png [20190610142552708.png]: /images/20220121/b8001bed1cbe4e169ef8d1f3774ac4c3.png [https_blog.csdn.net_LiuY521]: https://blog.csdn.net/LiuY521/ [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdVk1MjE_size_16_color_FFFFFF_t_70 7]: /images/20220121/4494b55a02e34b82abb753e690f2d59f.png [20190610151938511.png]: /images/20220121/9381b044998f4d4fbf6b8aa2e0afa7d3.png [20190610152520370.png]: /images/20220121/932d0f46f2144363a6cc5bbab57dd2bc.png [20190610152825738.png]: /images/20220121/75a78a2ef1a2426eafe0885d4ccb1323.png [20190610152838884.png]: /images/20220121/cbbbde50f5534da8a0d1f84587d7e009.png [20190610153114858.png]: /images/20220121/794b42dd13da4bb9b37649d14ed9ee06.png [20190610154222991.png]: /images/20220121/5863716910794376b3d68b8999f9550c.png
相关 Easymall项目分布式拆分整合(七) Easymall项目分布式拆分整合(七) -------------------- 目录 不念不忘少年蓝@/ 2022年05月01日 12:51/ 0 赞/ 268 阅读
相关 Easymall项目分布式拆分整合(四) Easymall项目分布式拆分整合(四) -------------------- 目录 桃扇骨/ 2022年04月27日 19:52/ 0 赞/ 351 阅读
相关 Easymall项目分布式拆分整合(二) Easymall项目分布式拆分整合(二) -------------------- 目录 r囧r小猫/ 2022年04月27日 16:54/ 0 赞/ 354 阅读
相关 Easymall项目分布式拆分整合(六) 前台系统和后台系统的功能整合 -------------------- 目录 刺骨的言语ヽ痛彻心扉/ 2022年01月20日 08:45/ 0 赞/ 202 阅读
相关 Easymall项目分布式拆分整合(五) Easymall项目分布式拆分整合(五) 目录 Easymall项目分布式拆分整合(五) 一.搭建后台 你的名字/ 2022年01月20日 02:33/ 0 赞/ 323 阅读
相关 Easymall项目分布式拆分整合(八) Easymall项目分布式拆分整合(八) -------------------- 目录 系统管理员/ 2022年01月15日 16:43/ 0 赞/ 268 阅读
相关 Easymall项目分布式拆分整合(九) Easymall项目分布式拆分整合(九) -------------------- 一.购物车系统搭建 古城微笑少年丶/ 2022年01月15日 03:35/ 0 赞/ 310 阅读
相关 分布式设计与开发(四)------数据拆分 一个大型系统里各个环节中最容易出性能和可用性问题的往往是数据库,因此分布式设计与开发的一个重要领域就是如何让数据层具有可扩展性,数据库的扩展分为Scale Up 和Scale 「爱情、让人受尽委屈。」/ 2022年01月05日 09:27/ 0 赞/ 164 阅读
还没有评论,来说两句吧...