安卓开发工具包-拼多商城讲义_第1页
安卓开发工具包-拼多商城讲义_第2页
安卓开发工具包-拼多商城讲义_第3页
安卓开发工具包-拼多商城讲义_第4页
安卓开发工具包-拼多商城讲义_第5页
已阅读5页,还剩432页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Web开发更加快捷。提供了优雅的HTML和CSS规范,能制作响应式网页。Bootstrap运行in项Bootstrap2.4.1.查<!DOCTYPE<!DOCTYPE<metacharset="UTF-<title>Inserttitle<style@mediaonlyscreenand(min-width:0px)and(max-width:768px){bodybackground-color:}}@mediaonlyscreenand(min-width:768px)and(max-width:992px){bodybackground-color:}}@mediaonlyscreenand(min-width:992px)bodybackground-color:}}<!DOCTYPE<!DOCTYPE<metacharset="UTF-<title>Inserttitle<style.item{color:red;}.titlefont-size:}<div<div<divclass="item<!DOCTYPE<!DOCTYPE<metacharset="UTF-<title>Inserttitle<styledivfloat:}@mediaonlyscreenand(min-width:0px)(max-width:768px).col-xs-12{width:100%;}.col-xs-6{width:50%;}}@mediaonlyscreenand(min-width:.col-sm-12{width:100%;}.col-sm-6{width:50%;}}<divclass="col-xs-12col-sm-<divclass="col-xs-12col-sm-在chrome浏览器elements窗口中会发现当屏幕大于768时,col-sm-6768com-xs-12超0-幕平板768-1200在Bootstrap源码1625行中定义了col-xs-12样式,图-Bootstrap使用bootstrap框架制作一个网页网页嵌套关系图-Col_xs超小Col_sm小Col_md中<div<div <!DOCTYPE<metacharset="UTF-<linkrel="stylesheet"type="text/css"<div<div class="col-xs-12col-sm- class="col-xs-12col-sm- elements小于768时,只有com-xs-12生效。Vue是个的前端框架,比jquery,ajax开发效率高,>开始使用-->指南查看那些公 VueVue从optionselroot.style.backgroundColorroot.style.backgroundColor=}varoptions=el:}varvue=new<!DOCTYPE<metacharset="UTF-<title>Inserttitle<div<script//申明一个VuenewfunctionVue(options)varel=varroot 从options.data1,在optionsdata2,调用vue()函数<!DOCTYPE<!DOCTYPE<metacharset="UTF-<title>Inserttitle<div<scriptfunctionvarvarvarvar}var}}varvue=new1.mounted函数<!DOCTYPE<!DOCTYPE<metacharset="UTF-<title>Inserttitle<scriptfunctionVue(options)varmounted=options.mounted;window.onload=mounted();}varoptions=mounted:function(){}}varvue=new每隔10ms从options.data中取数据,显示在Body中增加div,insertBtn<!DOCTYPE<!DOCTYPE<metacharset="UTF-<title>Inserttitle<button<div<script框架自动从上functionVue(options)varel=varroot vardata=options.data;varitems=data.items;setInterval(function(){root.innerHTML="";for(vari=0;i<items.length;{varitem=vartitle=item.title;root.innerHTML=root.innerHTML+title+}},}varoptions={el:"app",data:{items:[{title: }}}varvue=newfunctioninsert()varindex=varitem=titletitle新商品options.data.items[index]=}加事件了,自动从options找一个函数来处理<button<!DOCTYPE<!DOCTYPE<metacharset="UTF-<title>Inserttitleforfor(vari=0;i<buttons.length;i++)varbutton=varattributes=for(vari=0;i<i++)varattribute=varattributeName==if(attributeName=="@click") }}}}varoptions=deleteTest:function(){console.log("deleteTest");}}<scriptfunctionVue(options) //遍历所有varvarvue=new1@click写<!DOCTYPE<!DOCTYPE<metacharset="UTF-<title>Inserttitle <button<scriptfunctionVue(options) for(vari=0;i<buttons.length;i++)varbutton=varattributes=for(vark=0;k<k++)

varattribute=varattributeName= if(attributeName=="@click") value)if(key==attributeValue){button.onclick=value;}}}}}varoptions=deleteTest:function(){console.log("deleteTest");modify:function()}}varvue=new<!DOCTYPE<!DOCTYPE<metacharset="UTF-<title>Inserttitle <button<div<scriptfunctionVue(options)varel=varroot= setInterval(function(){root.innerHTML=varitems=for(vari=0;i<items.length;{varitem=root.innerHTML=root.innerHTMLitem.title+}}, for(vari=0;i<buttons.length;i++)varbutton=varattributes=for(vark=0;k<k++)

varattribute=varattributeName= if(attributeName=="@click")value)if(key==attributeValue)button.onclick=}}}}}varoptions={el:"app",data:{items:deleteTest:function(){insert:function()varitem={title新商品"}}varvue=newvue引入vue框架创建options<!DOCTYPE<!DOCTYPE<metacharset="UTF-<title>Inserttitle <div<divv-for="itemin<scriptvaroptions={el:"#app",mounted:function(){data:{items:[{title:},"title电脑}methods:deleteItem:function(param){}}varvue=new<!DOCTYPE<!DOCTYPE<metacharset="UTF-<title>Inserttitle <div商品名称:<input<divv-for="itemin <scriptvarusers=["user1","user2","user3","user4"];users.splice(1,users.splice(0,varoptions={el:"#app",

data:{items:[{title: },title电脑}methodsmethodsdeleteItem:function(param)i++)varitem=this.items[i];if(item.title==param){this.items.splice(i,}}console.log("deleteItem"+insert:function(){ varitem=title:}}}varvue=new设置数据包的大小,如果不设置,sql文件态大,只能执行一部分sql SETGLOBAL \ , \android\pdServer\pd.sql中的所有内容到查询窗口图-图-eclipse中import图-图-把path设置成/,如图-图-修改MySql通过能看到商城电脑端的首页,图-参考培优课前资料亿发移动端课前资料jsonView,安装后chrome-图-

mounted:mounted:function(){varurl="/api/getIndexItem.html";{}){}图-首页包含两个row,如图-图- pdServer/src/main/webapp中创建网<!DOCTYPE<!DOCTYPE<metacharset="UTF-<title>Inserttitle href="css/bootstrap.css"/><divid="app"<div<divclass="col-xs-class="img-responsive"/><br<div <divid="app"<div v-for="itemin<span>{{item.title}}</span><br<scriptvarvue=newel:mounted:function(){data:{items:[{title:" price:2000{title电脑",price:3000}]}图- mounted:mounted:function(){var{}){}图-4.4.1.<!DOCTYPE<!DOCTYPE<metacharset="UTF-<title>Inserttitle href="css/bootstrap.css" <divid="app"class="container-<div<divclass="col-xs-class="img-responsive"/><br<divv-for="itemin <imgv-bind:src="item.image" <scriptvarvue=newel:mounted:function(){varurl="/api/getIndexItem.html";{var//服务器返回的结果有var){var;}}){}data:{itemsdata:{items:[{title:" price:3000{title电脑",price:3000}]}图-<!DOCTYPE<!DOCTYPE href="css/bootstrap.css"<metacharset="UTF-<title>Inserttitle<divid="app"<div<divclass="col-xs-<ahref="mobileIndex.html">返回<!DOCTYPE<!DOCTYPE href="css/bootstrap.css"<metacharset="UTF-<title>Inserttitle<divid="app"<div<divclass="col-xs-<ahref="mobileIndex.html">返回<scriptvarvue=newVue({el:"#app",mounted:function()//断 varmap=varitemId=map.get("itemId");}<!DOCTYPE<!DOCTYPE href="css/bootstrap.css"<metacharset="UTF-<title>Inserttitle<divid="app"<div<divclass="col-xs-<ahref="mobileIndex.html">返回

<br>v-class="img-responsive"><divv-<scriptvarvue=newVue({el:"#app",mounted:function()//断点varmap=varitemId=map.get("itemId");varvar}}学程序的重要5.1.1.图-.1.3.当某个行为产生后,能在 好友/群、中5.1.4.,支付宝小程5.1.5.图- 图- 图-图-图- 图- 图- 图-图-图-1,扫 图-图-3,选择程序,输入appId,如图-图-图-5, 图-图-图-图-图-创建模1,选中page右键“新 图-2,register,右键“新建Page”,如图-图-图- {{}制作界面图-<view<textwidth:100%;height:200rpx;background-color:red;padding-left:48rpx;padding-top:padding-top:}font-size:48rpx;}制作界面图-<view<text border:1pxblack}margin-top:24rpx;width:80%;} *data:{username:"",password:""usernameInput:function(e){varusername=e.detail.value;username:passwordInput:function(e){varpassword=e.detail.value;password:register:function(e){}})++onReady:onReady:function(){ 代码在“\亿发,移动端课前资料图-image,audio如图-图-game,game"pages":"pages":width:320px;height:background-color:}onShow:onShow:function() = 路 800,onShow:onShow:function()varbgX=functionrun()= =bgX=bgX-10;console.log("bgX="+bgX);if(bgX<(320-800))bgX=}context.drawImage(backgroundPath,bgX,0,800,600);}//100ms运行一次setInterval(run,onShow:onShow:function(){varbgX=0;varcarX=0;varindex=0;functionrun() varcarPath=bgX=bgX-console.log("bgX="+if(bgX<(320-800))bgX=}context.drawImage(backgroundPath,bgX,0,800,600);if{}varcarY=400;if(index%2==0){}context.drawImage(carPath,carX,100,}}//100ms运行一次runsetInterval(run,100);}图-page必须在app.json中申明,才会执行生命index,程序一启动,就创建所有的//pages/index/index.jsconsole.log("//pages/index/index.jsconsole.log("index.js")*data:*生命周期函数- onLoad:function(options){console.log("index*生命周期函数- onReady:function(){console.log("indexonReady()");*生命周期函数- onShow:function(){console.log("indexonShow()")*生命周期函数- onHide:function(){console.log("indexonHide()")*生命周期函数onUnload:function()console.log("index)图- <textbindtap='indexClick'>index</text> {url:}图-windowsip的ip地址。在windows上执行ipconfig查看以太网或无线网卡的ip地址,不是vmnet1,vmnet8的ip地址,不是linux的ip地址。小程序开发工具中设置→项目设置,如图-图-onReady:function(){console.log("loginonReady:function(){console.log("loginonReady()"); success:function(response){fail:function(e){}联网之后,得到的数据如图图-图-onReady:function(){console.log("loginonReady:function(){console.log("loginonReady()");varpage=this; success:function(response){varserverData=response.data;varitems=serverData.data;for(var{}}<image拷贝图片,图片在亿发<view<view图-<view<textclass='titleText'>登录 <buttonclass="btn"bindtap='login'>App.wxsswxml文件都width:100%;height:100rpx;padding-left:48rpx;padding-top:26rpx;}font-size:}border:1pxblack}margin-top:24rpx;width:80%;}url:} <view<textbindinput='usernameInput' {url:}globalData:userInfo:null,globalData:userInfo:null,}"varonReady:function(){usernameInput:usernameInput:function(event)varusername=event.detail.value;username:passwordInput:function(event){varpassword=event.detail.value;password:confirmPasswordInput:function(event){confirmPassword:mailInput:function(event){varmail=event.detail.value;mail:mobileInput:function(event){varmobile=event.detail.value;mobile:register:function()varusername=this.data.username;varpassword=varconfirmPassword=varmail=varmobile=varurl=app.globalData.serverIp+"user/register.html?username="+username+"&password="+password+"&="+mail+"&phone="+mobile;url:url,success:function(response){varserverReturnData=response.data;varstatus=serverReturnData.status;if(status==200){title:成功',}else{title:失败}fail:function(e){}usernameInput:usernameInput:function(event)varusername=event.detail.value;username:passwordInput:function(event){varpassword=event.detail.value;password:login:function()varusername=this.data.username;varpassword=varvarurl="&password="+url:url,+++success:function(response)if(status==200){title:成功',}else{title:失败}fail:function(e){} 创建pagestoreIndex修改storeIndex.xmlifif(status==200)title:成功',url:图-创 page创 page"tabBar":"tabBar":"color":"selectedColor":"#FF670c","list":[{"text首页",{"pagePathpages/message/message","text":"消息",{"pagePathpages/me/me","text":"我",}]}////url://url:wx.setStorageSync("user",wx.setStorageSync("user",storage中查看保存的数据如图-图-Index.js中判断有没有用户名,如果有直接跳转到onReady:onReady:function()console.log("username="+username)setTimeout(function(){if(username){url:}else{url:}},图-确认提交审核中点“下一步”,如图-图-图-图- demo创建项目指向demo,运行demo,查看 c/sb/sc/sb/s做软件运行在电脑,推荐用做软件运行在上,叫app,推荐用 图-dos下执行在图-57输入cmd,打开dos,如图-58.执行令是nox_adb.execonnect图-如果不出现,在dos窗口中再执行一次”nox_adb.execonnect:62001”图-点“ProceedwithoutInstantRun”不用闪电安装图-图-Android图-图-单击图-64中的textxml图--图-project01图-图-图-androidactivity_main.xml1,修改文本,字号2,设置<!--match_parent<!--match_parent是父容器的大小<!--学 的区别,design,text的作用 tivityTextView savedInstanceState){ //方法必须是提示出来的,studio必须配置好,//接口名是方法名去掉set,接口名是提示出来的,onClick是studio生成的View.OnClickListener()publicvoidonClick(Viewv){"你单击了我"}}}图-从上 到\app\build\outputs\apk文件夹下找到apk,拷贝到\pdServer\src\main\webapp文件夹androidStudio中将视图切换成project,找到图- <ahref="app- 图- 图- 图-图-图-Android图-filenameview1,如图-77

图-<?<?xmlversion="1.0"encoding="utf-<!--vertical从上向下 horizontal从左向右排-- <?<?xmlversion="1.0"encoding="utf- view3.xmllinearlayout,view2.xml中的<?<?xmlversion="1.0"encoding="utf-<!--把linnearLayout改成scrollView android:text="button1"/>View3.xmlbutton加android:text="button1"/> tivity savedInstanceState){ View.OnClickListener(){publicvoidonClick(Viewv){"btn1"}}}Androidjs添注意uses- 放在 <?xmlversion="1.0"encoding="utf- <activityandroid:name="ent.action.MAIN"/>AndroidsavedInstanceState) String}Android调图-}username:<input<!DOCTYPE<metacharset="UTF-<title>Inserttitle<scripttype="text/javascript">functionsetUsername(){ 在电脑上用chromeconsole测试ButtonButtonbtn1=(Button)findViewById(R.id.btn1);View.OnClickListener(){publicvoidonClick(Viewv)//java中调}JavaScript调用Android中的图-ptivityptivity{ View.OnClickListener(){publicvoidonClick(Viewv)//java中调}Phonephone=new//jsphone对在js中通过androidPhoneObject来调用phone对}//内部finalclass publicvoidcall(){Uri }}}jsfunctionfunction{//js中windowandroidPhone// 上运行时,window.androidPhone} 图-拼多商城android图-在Relativelayout中增加background景 图-图-<?xmlversion="1.0"encoding="utf- android:textSize="48dp"/>android:text="用户名android:layout_height="wrap_content" "android:layout_height="wrap_content"android:text="登录 "图-tivitypsavedInstanceState)=}}classToLoginThreadextendsThreadpublicvoidrun()try Intent(MainActivity.this,}catch(Exceptione){}}}}图-登录中单击按钮跳到到//单击登录界//单击登录界面中界ButtonregisterButton=View.OnClickListener(){publicvoidonClick(Viewv){ ,RegisterActivity.class);}联网用

publicPdResultregister(PdUserthrows{PdResultajiaResult=newPdResult();Stringpassword=ajiaUser.getPassword(); Stringusername=ajiaUser.getUsername();PdUserdbPdUser=userServiceif{intif{}}return} 再刷新url,服务器执行下面select查询用户SELECTSELECT*FROMpd_userORDERBYid图-图-Jar文件要放到app/libs文件夹,如图-88图-把两个jar加到编译路径中有两种方法第法,如图-89所示。图-在图-90中点击图-图-{privateintstatus;privateStringmsg;privateObjectpublicStringgetMsg()return}publicvoidsetMsg(Stringmsg)this.msg=}publicObjectgetData()return}publicpublicvoidsetData(Objectdata)this.data=}publicintgetStatus()return}publicvoidsetStatus(intstatus)this.status=}}publicpublicclassPdApplication}<!--权限<activityandroid:name="ent.action.MAIN"/>ptivitysavedInstanceState)finalButtonregisterBtn=(Button)View.OnClickListener(){publicvoidonClick(Viewv)

try//1.5个控 EditTextconfirmPasswordEtEditTextphoneEt=(EditText) Et=(EditText) //2. //3.//4.1拼出 =++username+passowrd+ =";

//4.2发数myErrorListener=newRequestQueue=}elseToast.makeText(RegisterActivity.this," 不一致",Toast.LENGTH_LONG).show();}}catch(Exceptione){}}} Response.Listener<String>publicvoidonResponse(Strings){Log.i("pd",s);//4.3//4.4json转成对 JSON.parseObject(s,if(result.getStatus()==200)Toast.makeText(RegisterActivity.this 成功",}elseToast.makeText(RegisterActivity.this 失败",}}} Response.ErrorListenerpublicvoidonErrorResponse(VolleyErrorvolleyError){}}}图- publicPdResult{password) PdResultajiaResult=newPdUserif(dbPdUser!=null{}return} tivity savedInstanceState){//单击登volley发数据给服务 View.OnClickListener()publicvoidonClick(Viewv)//1,找到EditTextusernameEt=EditTextpasswordEt=//2,接收界面上用户输入的数 //3,判断 ||TextUtils.isEmpty(password))Toast.makeText(LoginActivity.this,"用户名或不能为空",Toast.LENGTH_LONG).show();}else//4.//4.1 PdApplication.SERVER_IP+"/user/login.html" username+

successListener=newMyErrorListener=newStringRequestrequest= }}//单击登录界面中 按钮跳 界 View.OnClickListener(){publicvoidonClick(Viewv)//跳 界 }}//内部 Response.Listener<String>publicvoidonResponse(Strings)//4.3在回调的方法中接收//4.4处理数//4.5把结果显示在界面 JSON.parseObject(s,成功",Toast.LENGTH_LONG).show();}}else失败",Toast.LENGTH_LONG).show();}}} Response.ErrorListenerpublicvoidonErrorResponse(VolleyErrorvolleyError){System.out.println("}}}错 +图-javaClass,类名为publicclasspublicclassextendsprotectedvoid{}}文件,activity要放在application标 <?xmlversion="1.0"encoding="utf- <!--权限<activityandroid:name="ent.action.MAIN"/>ifif(result.getStatus()==200)Toast.makeText(LoginActivity.this,"登录成功",Toast.LENGTH_LONG).show();try{//=}catch(Exceptione){}}8.7.1.分析,如图-94所示图-图-OpenHelperpublicDatabaseHelper(Contextcontext)super(context,"pd.db",null,}publicvoidDatabasedb)Stringsql="createtablepd_user+"usernamevarchar(50))}publicvoidonUpgrade(oldVersion,intnewVersion){Databasedb,}}publicpublicclassUserDAOusername)insert(Contextcontext,//得到连 //得到写数据库 contentValues.put("username",//添StringtableName=long null,}}ifif(result.getStatus()==200)Toast.makeText(LoginActivity.this,"登录成功",Toast.LENGTH_LONG).show();try{//UserDAOuserDAO=new }catch(Exceptione){}}在dos令adb在dos令adbroot@android:/root@android:/#root@android:/#cdroot@android:/data#root@android:/data#cdroot@android:/data/data#lse## e#cddatabases e/databases#ls e/databases# 3pd.dbversion3.7.112012-03-20Enter".help"forEnterSQLstatementsterminatedwithaandroid_metadatapd_userselect*from e/databases#exitD:\Program 图-publicpublicintquery(Contextint //得到sql语句的对//定义Stringsql="select*fromString[]//cursor游标相当于 if{}return}classToLoginThreadextendsThread{publicvoidrun()try//从数据库中查询用户是否UserDAOuserDAO=new if(count>=1)//已经登录过,直接显示主界 }else//没登录,跳到 Intent(MainActivity.this,}}}catch(Exceptione){}}}图- 图-//fragment//fragment类是v4publicclassIndexFragmentextendsFragment@NullableBundlesavedInstanceState)//把fragment_index.xml转成 // //单击超连接,打开的 的浏览器,不能打浏览

//用webView加载网//允许webview执行//return}}publicpublicclassMainFragmentActivityFragmentActivity{IndexFragmentindexFragment;protectedvoid{// //开始事//动 1:加 indexFragmentindexFragment=new//2//add()和show()有一个失败了,出异常,不执行//提交事}}显示消息,我图-{ @NullableBundlesavedInstanceState)Viewreturn}}publicpublicclassMeFragmentextendsFragment@NullableBundlesavedInstanceState)Viewreturn}}FragmentActivityIndexFragmentFragment[]fragments=newButton[]buttons=new//现在显示的是第几个int//单击的按钮是第几intprotectedvoid{// //开始事//动 1:加 indexFragmentindexFragment=new//2//add()和show()有一个失败了,出异常,不执行//提交事// MeFragmentmeFragment=new//把三个fragment放到fragments //设置事 for(Button{}//设置第一个按钮的状态为选} 的 {publicvoidonClick(Viewv)//判断单击是第几个按钮clickBtnIndex=1switch{case}//判断单击的是不是当(currentFragmentIndex!=clickBtnIndex)//动作2:添加新的if{}//3://}}}}在androidManifest.xml配置屏幕切换时不执行图-100所示。图-京淘项目中使用httpClient上,如图-1所示。微服务一般做成分布式。图-拆分成多个项目如cart,sso,order,web容易,好定位bug。可扩展,订单部署3台服务器,web集nginx,nginx再3台订单服务器http-client使用http协议,请求有请求行,请求发送信息比httpClient,如图2图-zookeeper的作用如图-3图-ZooKeeper地址会写入zookeeper.zookeeper内部会服务列表,某个服务提供者当消费者需要服务时,需要先zookeeper获取服务列表信息.之后将服务列表保存到本地缓如果ooepr服器出宕现象.时中心通过心跳检测的方式判断服务器是否宕机.如果服务器宕机则会将该服务器信息从服务列表中删除之后将新的服务列表发送消费者(客户端)进行更新.Zookeeper与nginx,mycatZookeeper与nginx,mycat的比较如图-4图-Zookeeper如图-5图-加载新的虚拟机第将京淘课前资料下发-2\3-jt初始化虚拟机\dsCentOS-empty.zip解压双击dsCentOS.vmx文件,选择“我已该虚拟机”如图-6所示.图-在Windows系统dos中运行ipconfig查看vmnet8的ip,为虚拟机设置静态ip,虚拟机的静态ip可以是前一个虚拟机的ip加1,ip的前三段应该与serviceserviceiptableschkconfigchkconfigiptables使用下图中比较新的快照克隆如图-7所示。使用早期的快照,有些基础软件没装上,后面我们用的软件装不上。图-选择现有快照如图-8图-选择完整克隆如图-9图-xs 图-10所示。图-Filezilla在京淘课前资料下发-2\7-Fz置信息如图-11所示。图-使用fz进入/usr/local/src,注意不要进入上传jdk1.8,jdk1.8在京淘课前资料下发在 执行命令解压tartar-xzvfjdk-8u51-linux-使用fz/etc/profile到windows中,操作步骤如图-12所示图-使用工具修改 如图-13所示,并上传图-在xs 中执行source/etc/profile使配置执行javaversion查看jdk1.8,如图-14所示。图-车\zookeeper安装包”文件夹中的zookeeper-3.4.8.tar.gz到/usr/local/src执行下面令解压cdcdtar-xzvfzookeeper-在zookeeper- 下创建文件夹data和cdcdcdcdzookeeper-mkdirdata pwd data zoo.cfg文件中12行的dataDir修改后如图-15图-使用fz上传zoo.cfg到zookeeper3.4.8/confcdcd/usr/local/src/zookeeper-shzkServer.shstarted,如图-16图-[root@localhostbin]#sh//[zk:localhost:2181(CONNECTED)0]ls//[zk:localhost:2181(CONNECTED)1]Dubbo系图-在windows中部署dubbo系统。通过系统查看dubbo的提供者信息。面的学习,我们可以使用zk客户端查看服务信息。Windows中拷贝\Day15-dubbo实现购物车\dubbo控制jdk版本,如图18所示图-根据jdk版本拷贝对应的root.war到webapps双击\tomcat-dubbo\bin\startup.bat启动zookeeper服务器ip地址,会报下面的错误如图-19所示。图-将\ROOT\WEB-INF\perties中的ip地址改为虚拟机的IP地址端2181不用改要保留下来。修改后记得保存,如图-20所示.图- tomcat dos , 用户名是root是登录成功后如图-21图-DubboDubbo运行过程如图22图-项目之间关系如图23图-Windows——>Preferences——>Java>ContentAsistAutoactivationtriggersforJava后面的文本框里只有一个。现在你将其改为Eclipse→validation→Disable项目类型是quickstartgroupId是com.jt.1803artifactIddubboInterface创建包com.tedu.service,如图-24图-publicpublicinterfaceCartService}Runas→maven创建第一个提供者项目,类型是dubbodubbospringjar,这些jar会自动添加进来,如图-25所示图-强制更新,如图26图-eclipse→preferences图-27所示图-在拷贝别人或网盘的maven拷贝完后,本地仓库文件夹应该有org-28图-创建包CartService{return"第1个提供 cartuserId="}}jar所在位置如图-29图-解 dubbo-2.8.4.jar, meta-inf中找Window→preference→xml→xmlcatalog添加catalog,如图30Locationdubbo.xsd文件Key /schema/dubbo/dubbo.图- <?xml<?xmlversion="1.0"encoding="UTF- a- 中心zookeeper-- <dubbo:registrytimeout="900000"1,设置应用(微服务)名称<dubbo:application<dubbo:registrytimeout="900000"1,设置应用(微服务)名称<dubbo:application<dubbo:protocolport="20880"<dubbo:protocolport="20880"<!--<!--4,设置实现类<bean<!--5,设置客户端服务的地址,地址是接口名--<dubbo:service>publicpublicclassprovider1MainExceptionClassPathXmlApplicationContextSystem.out.println("1启动");{}}}cdcd/usr/local/src/zookeeper-3.4.8/binshzkCli.sh[zk:localhost:2181(CONNECTED)1]ls/[dubbo,zookeeper]//查看dubbo[zk:localhost:2181(CONNECTED)2]ls/dubbo ////[zk:localhost:2181(CONNECTED)3]localhost:8090,如图-31所示图-dubbo与zookeeper的关拷 dubboProvider1项目,改名cartServiceImpl2个提return"第2个提供 cartuserId="}1.设置应用名称<dubbo:application2.配置zookeeper地址3.<!--4.配置实现类的类名5.配置接口名,开放服务publicpublicclassprovider2MainExceptionClassPathXmlApplicationContextSystem.out.println("2启动");{}}}}Dubbo中查看提供者创建类型 quickstart maven项<?xml<?xmlversion="1.0"encoding="UTF-bo.xsd<dubbo:applicationname="cart"中心地址有@serviceLoginServiceImpl@autowiredLoginService@autowiredCartService,@autowired--publicclassCartControllerExceptionClassPathXmlApplicationContextcontext while(true) System.out.println("服务消费者收到的结果:"+string);}}}cdcd/usr/local/src/zookeeper-3.4.8/binshzkCli.sh[zk:localhost:2181(CONNECTED)1]ls/[dubbo,zookeeper]//查看dubbo[zk:localhost:2181(CONNECTED)2]ls/dubbo //退出zkCli[zk:localhost:2181(CONNECTED)3]quitcdcd/usr/local/src/zookeeper-shzkServer.sh说明:zk如果宕机后,消费者能否正确运行因为zk会动态的向客户端更新服务列表信息.当宕机后,zk的服务列表信息,所以客户如果这时,所有的服务端程序都宕机,则整个服务陷入RPC(RemoteProcedureCall)—过程调SOASOA面向服务的架构(Service-oriented图-图-易定位2、可靠性差:由于高度依赖网络状况,任何一次以管理员运行如果前面课程中已经配置好switch,不用再配置linuxredis上 \培优课前资料\亿发,移动端课前资 tar-xzvfredis-cdredis-在redis 下运行makeinstall,编译redis上传“亿发,移动端课前资料\redisCluster\置文件\cluster文件夹到“/usr/local/src/cdshstart.shpsef|grepredisredis在redis的 cd/usr/local/src/redis- 如图-34所示,输入yes图-查看集群状态,如图-35图-nginx\ #gzip#gzipserverlisten80;;location/ }}server{listen80;location/ }}server{listen80; location/ }}server{listen80; location/ }}server{listen80; location/ }} server{listen80; location/rootD:\jt-}}}如果前面课程中已经配置好数据库,不用再配置jtdb设置数据包的大小,如果不设置,sql文件态大,只能执行一部分sql SETGLOBALTb-order_item表添加CREATEDUPDATED如图-36图-redisip初始项目代码“001dubbo初始代码”在“\培优001dubbo初始代码.rar,文件夹不要有中依次导入jt-dubbo-parent, jt-dubbo-orderjt-dubbo-web7个项目修改jt-dubbo-manager,jt-dubbo-cart,jt-dubbo-order,jt-dubbo-sso,jt-dubbo-web五个项目中redis服务器ip地址perties在每个项目的每个项目执行runas→maveninstall发布启动jt-dubbo-manager,jt-dubbo-cart,jt-dubbo-order,jt-dubbo-sso,jt-dubbo-webHttpclient实现如图-37图-(service,pojo提供者的关系,如图-38所示。图-dubbo,zookeeper相关依赖

quickstart,如图-39图- dubbo,zookeeper相关依赖>pojo,service,如图-40图- jt-dubbo-cart Cart.java 从jt-dubbo-cart中拷贝cartService.javajt- pojo和service,如图-41图-com.jt.cart.service.-cartdubbo的依赖都不一样,因为dubbo要依赖dubbo,zookeeper相关依赖从dubboProvider1项目拷贝applicationContext-provider.xml放 main/resources/spring,修改applicationName,端口<?xml<?xmlversion="1.0"encoding="UTF-

<!--微服务提供者配置文件作用是把提供者的端口, 中心zookeeper-->1,设置应用(微服务)名称<dubbo:application<!--2,设置zookeeper的ip地址和 --<dubbo:registrytimeout="900000"<!--3,设置微服务的 --<dubbo:protocolport="20884"4,设置实现类<beanid="CartServiceImpl"><!--5,设置客户 服务的地址,地址是接口<dubbo:servicetimeout="900000">Jt-dubbo-web通过httpClientjt-dubbo-cart的CartController,用了dubbohttpClient了,要删除CartController。Web.xml中自动加 dubbo配置文配置文 bo-cart三个项目Runas→maveninstallcdcd/usr/local/src/zookeeper-3.4.8/binsh/zkCli.shlslss,如图-42所示图-以前的程序在jt-web中是用httpClientjt-cart,如图-43所示。图-在pom.xml中添加下面dubbo依赖,和jt-dubbo-cartdubbo,zookeeper相关依赖 pojo和service,如图-44所示图-jt-dubbo-webpojoCart删除jt-dubbo-web中的cartService包中的接口使用jt-dubbo-interface中的Jt-dubbo-webcartController,orderController中的import原先代码导入的包 com.jt.web要改将importcom.jt.web.pojo.Cart改成import从dubboConsumer项目中拷贝消费者配置文件,并修a-a- <?xmlversion="1.0"encoding="UTF- 中心zookeeper-- 1,设置应用(微服务)名称<dubbo:application<!--2,设置zookeeper的ip地址和 --<dubbo:registrytimeout="900000"3,dubbocheck=false消费者启动时不会检查提供者是否启动--><!--cartController@autowiredCartServicecartservice-->timeout="90000"check="false">者。是cdcd/usr/local/src/zookeeper-3.4.8/binsh/zkCli.shlsls/dubbos如图-45所示图-直接输入断点如如图-46所示图-页面效果,如图-47图-jt-dubbo-web/CartControllerjt-dubbo-cart/CartServiceImpl中新增,分析如图48图-jt-dubbo-interface,创建com.jt.order.pojo,Jt-dubbo-interface中创建order子包,在order.pojo,order.service两个包。包结构如图-49所示图-拷贝jt-dubbo-order中的实体类Order,OrderItem,OrderShip到 .jt.order.pojo中.拷贝jt-dubbo-order/orderService到 .jt.order.service拷贝后如图-50图-jt-dubbo-order service/orderService, Jt-dubbo-order添加dubbo在pom.xml中添加下面dubbo依赖,和jt-dubbo-cartdubbo,zookeeper相关依赖Jt-dubbo-web通过httpClientjt-dubbo-order的OrderController,用了dubbohttpClient了,要删除OrderController。 <?xmlversion="1.0"encoding="UTF-

<!--微服务提供者配置文件作用是把提供者的端口, 中心zookeeper-->1,设置应用(微服务)名称<dubbo:application<!--2,设置zookeeper的ip地址和 --<dubbo:registrytimeout="900000"<!--3,设置微服务的 --<dubbo:protocolport="20885"--

4,设置实现类<beanid="orderServiceImpl"<!--5,设置客户 服务的地址,地址是接口<dubbo:servicetimeout="900000">Jt-dubbo-interface增加了Order要runasmaveninstallJt-dubbo-orderrunasmavenshshzkCli.shls/lspojo和删除service/orderService,orderServiceImpl,如图-51所示图-修 jt-dubbo-web/orderController中1.Order,OrderService的包修改前如图-52所示图-修改后如图53图-Jt-dubbo-webrunas→mavenshshlsls如图-54图-在reference中配置负载均衡策interface="..."loadbalance="randomRandomRoundRobinLeastActiveConsistentHash一致性Hash如图-55所示。图-图-56所示。图-用户的请求,服务器接收后,首先写入消息队流量削峰也叫限流削峰或削峰填场景说明:用户下单后,web系统需要通知订单系统。传统的做法是,web系统调用订单系统的接口。如下图

图-假如jt-dubbo-order无法,则用户下单失败。jt-dubbo-web系统与jt-dubbo-order系统耦合高图-58图-场景说明:用户后,需要发邮件和。传统的做法有两种1.串行的方式;2.并行方式回给客户端,如图-59所示图-时间,如图-60所示图-假设三个业务节点每个使用50100造后的架构如图-61所示:图-数据库的时间,也就是50毫秒。邮件,写入本可以忽略,因此用户的响应时间可能是50毫秒。MQMessageQueue消息队列(MQ)是一种应队列中获取消息,并且通信通过RPC调用,可以传递java对消息队列的产品,如图-62图-RabbitMQ使用fz在/usr/local/src下创建文件夹上传京淘项目每日课前资料\Day17-rabbitMQ\到rpmRPMRed-HatPackageManager(RPM软件包管理器的缩Red-hat是一种Linux,RPM是用来安装Linuxrpmrpm-ivhrabbitmq-server-3.6.1-安装过程如图-63图-安装rabbitMQweb管安装插件cdcdls#vim打开rabbitmq-pluginsvimrabbitmq- enablerabbitmq_managementThefollowingpluginshavebeenenabled: rabbit@localhost...failed.Couldnotcontactnoderabbit@localhost.Options:--online-failifbrokercannotbecontacted.--offline-donottryto##cd/usr/sbin#lsra*servicerabbitmq-server启动后如图64图-单击火狐浏览器,如图65图-在虚拟机中用localhost:15672能,能登:guest,登录成功后如图用户名:guest,登录成功后如图图-在windows上用http://虚拟机ip:15672能看到登录界面,但不能登录,如图-67所示。图-[root@localhost[root@localhostsbin]#[root@localhostsbin]#lsmanman进入命令模式输入/add_useradd_user字符串,如图-68所示图-会搜到下面的内容,如图-69图-进入命令模式输入qvi执行下面令创建一个用户用户名是jtadmin,rabbitmqctlrabbitmqctladd_userjtadmin执行下面令设置jtadmin是超级管理员在windows上用http://虚拟机ip:15672能看到登录Virtualhostexchangequeuechannel之间的关系,如图-70所示图-virtualHostExchanges:交换 作用:将消息发往不同的队中 号.超级管理员可以对用户,策略.者同时可以查看rabbingmq节点的相关.策略制定者policy进行.普通管理者仅可登陆管理控制.无法登录管理控制新增虚拟主机,如图-71图-选

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论