怎样自己建设网站并搭建后台服务器?

怎样自己建设网站并搭建后台服务器?,第1张

网站服务器其实就是我们通常说的web主机,对应不同的编程语言,单间网站服务器的软件不同,一般情况下,在windows环境下,一般以.asp .net .html为主,在这种情况下,搭建网站服务器就主要用到微软系统自带的iis(互联网信息服务)就可以了,Linux环境下就是php了,相对应搭建的软件就是apache+mssql了。java是跨平台的,哪个都可以。对于初学者来说,建议使用asp方面服务器,一方面是asp程序比较简单易懂,在修改过程中,还可以借助Dreamweaver等可视化编程工具,进行可视化编辑,另一方面windows环境下iis安装极其简单,在控制面板中——添加删除程序——windows组建,下拉找到iis,放入系统盘即可安装,无需下载任何东西。

在我们网站编程实际应用过程中,我们其实还用到一个简易的iis服务器,百度一下就能找到“简易iis服务器”,这是一些热心的网友开发出来的网站服务应用程序,同样可以起到iis的作用,但是支持的范围有限,对于一些高端的iis服务不支持,但是作为日常测试网站程序已经是足够了。如果你准备搭建的网站服务器是准备支持php的,那我推荐你安装“一键php集成调试环境”,安装极其简单,下载后,下一步就可以,这个集成环境,融合了,php解释器,mssql服务器,phpadmin,Apache服务器,php加速器等。可以说是一个完美的php服务器环境。

这里还没有完,下面还需要对网站服务器就行设置,设置网站的路径,使其指向你网站程序的存放目录,设置网站首页例如:index.asp,index.php等。然后测试一下自己的ip地址是多少,如果你的这台网站服务器是放置在局域网环境当中的,那还需要你再路由器上设置一下端口映射,否则外网的电脑是访问不了你这台电脑的,路由器就由于一道墙,他阻隔了你与外界的交流,也就是说保护着你这台电脑,但是你现在想让外部的电脑访问你,就必须让外部电脑了解你的位置,所以做一个端口映射就可以实现,具体如果做,请查看你所使用的路由器的型号来设置了,这里不详叙了,切记一定把80端口映射就可以,网站服务器默认的端口是80端口

        在后台业务快速增长的时代,如何快速构建api以及能够以最小的影响去部署服务是设计的一个趋势,SpringBoot就给开发者们这样一种能力。

       个人比较推荐IntelliJ,破解请自行百度。这款ide提供了更加炫酷的界面效果,能够更加方便的去调试管理项目。我是使用mac2019.3.3版本的,ide自带了springboot库。下面我们先使用SpringBoot官网创建一个项目。打开https://start.spring.io网址,选择版本后点击generate按钮生成项目,如下图所示:

SpringBoot有几个常用的注解是开发api常用的。

@RequestMapping用来配置api的路由和方法,@PostMapping表示是Post请求,@RequestBody表示数据存放在body,@RequestParam 标记参数的说明,@ResponseBody表示返回值定义。@Controller标记控制器

示例如下:

package com.instinct.auction.controller.login

import com.instinct.auction.controller.ResultBase

import com.instinct.auction.controller.data.UserManager

import org.springframework.beans.factory.annotation.Autowired

import org.springframework.stereotype.Controller

import org.springframework.web.bind.annotation.*

import javax.servlet.http.HttpServletRequest

import java.util.Dictionary

@Controller

public class LoginController {

public LoginController(){

userManager=new UserManager()

}

//@Autowired

    private UserManageruserManager

//@Autowired

// private HttpServletRequest request

    @RequestMapping("/api/login")

@ResponseBody

    public ResultBase  LoginIn(LoginInfo loginInfo){

//check memberinfo

        boolean success=userManager.checkMember(loginInfo.Name,loginInfo.Pwd)

String msg=success?"login success":"login error"

ResultBase result=new LoginResult(200,msg)

return  result

}

@RequestMapping("/api/login1")

@ResponseBody

    public ResultBase  LoginIn(@RequestParam(value ="name",required =true) String name,

@RequestParam(value="pwd",required =true) String pwd){

//check memberinfo

        boolean success=userManager.checkMember(name,pwd)

String msg=success?"login success":"login error"

ResultBase result=new LoginResult(200,msg)

return  result

}

@RequestMapping(value ="/api/register",method = RequestMethod.POST)

@ResponseBody

    public ResultBase Register(@RequestBody MemberInfo memberInfo){

//add to review list

//if telephone exist,return

        boolean containsName=userManager.containsName(memberInfo.Name)

if(containsName) {

ResultBase result=new LoginResult(200,"user already exist")

return  result

}

boolean containsTelephone=userManager.containsTelephone(memberInfo.phoneNum)

if(containsTelephone){

ResultBase result=new LoginResult(200,"telephone already exist")

return  result

}

ResultBase result1=new LoginResult(200,"审核中")

return  result1

}

@PostMapping(value ="/api/test")

@ResponseBody

    public String Test(@RequestBody MemberInfo info){

return  info.Name+info.phoneNum

}

}

如上图所示的test路由方法,如果忘记了些ResponseBody注解,则会发生接口已调用,但返回值为404的问题。

直接上干货,这个是前奏,比较山寨的实现,大家可先自行看下

https://github.com/xiaotutiger/miyue-music-service/tree/master/miyue-music-service

下面将分析手头上一个项目,运用的技术很全,值得学习,先做一个简单介绍,当然业务部分代码就不讲了。

整个工程采用maven来管理,主要的技术是spring+jedis+netty+disruptor.看这个组合,这个服务器端性能应该很不错。

这个工程又引发我对技术无限热爱 ,哈哈。

个工程,目前主要是针对一些基于json/xml/text格式的请求,同时也是支持标准手机请求的,当然,可以自定义一些其他格式或者pc端的请求,而

且针对不同URI,后面挂了不同的handler,这些可能都是一些web处理的基本思想,只是脱离了常规的web容器或者应用服务器。

xml工具采用xstram来处理,两个字,方便。

json工具采用jackson\不知道和业界出名的fastjson\gson\sf.json有何区别,待鉴定。

户端的请求,统一继承ClientRequestModel,经过编码统一转化为domainMessage,交由disruptor来处理,其实oop

里什么继承,实现,封装思想,大部分都在围绕一个东西在走,一句话,把看似各有棱角的东西如何转化为共同的东西,求同存异啊(比如,水,石头,空气等,如

果在这一层,我们没法统一用一个特征来表示,我们可以先把它转化为分子,那是不是可以用同一个东西来表示呢?如何高度抽象封装,这真是一门艺术)。

看这个工程对客户端请求,是如何一步步处理的,message->request->event 交由disruptor来处理,很美妙的思想。在了解这些之前,我们有必要深入学习一下disruptor,很特别的一个框架,宣言很牛逼,中文文档在这里(http://ifeve.com/dissecting-disruptor-whats-so-special/),E文好的同学请移步到这里(http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html)

了解disruptor之前,先学习下ringbuffer是如何实现的?

1、ringbuffer的特别之处:

只有一个指针,没有尾指针,基于数组,且不会删除元素,元素会覆盖,充分利用缓存行,减少垃圾回收。

2、如何从ringbuffer读取数据:

------------------------------------------2013-9-9 补充-----------------------------------------------------

下面主要讲一下请求如何处理这块架构吧,其实架构这个东西,说简单一点,就是一种简单可扩展的实现方式,在某些程度上,不要太在意性能。

底层通信建立在netty之上,基本没做任何改动

Java代码

public class HttpServerPipelineFactory implements ChannelPipelineFactory {

private ChannelUpstreamHandler channelUpstreamHandler

public ChannelPipeline getPipeline() throws Exception {

// Create a default pipeline implementation.

ChannelPipeline pipeline = pipeline()

// Uncomment the following line if you want HTTPS

//SSLEngine engine = SecureChatSslContextFactory.getServerContext().createSSLEngine()

//engine.setUseClientMode(false)

//pipeline.addLast("ssl", new SslHandler(engine))

pipeline.addLast("decoder", new HttpRequestDecoder())

// Uncomment the following line if you don't want to handle HttpChunks.

pipeline.addLast("aggregator", new HttpChunkAggregator(1048576))

pipeline.addLast("encoder", new HttpResponseEncoder())

// Remove the following line if you don't want automatic content compression.

pipeline.addLast("deflater", new HttpContentCompressor())

//pipeline.addLast("handler", new HttpRequestHandler())

pipeline.addLast("handler", channelUpstreamHandler)

return pipeline

}

public void setChannelUpstreamHandler(ChannelUpstreamHandler channelUpstreamHandler) {

this.channelUpstreamHandler = channelUpstreamHandler

}

}

相关spring配置

Java代码

<bean id="httpServerPipelineFactory" class="com.yunchao.cm.network.http.HttpServerPipelineFactory">

<property name="channelUpstreamHandler" ref="httpRequestHandler"/>

</bean>

Java代码

<bean id="httpRequestHandler" class="com.yunchao.cm.network.http.HttpRequestHandler">

<property name="urlMaps">

<map>

<entry key="/payorder">

<ref bean="payOrderCodecFactory"/>

</entry>

<entry key="/question">

<ref bean="questionCodecFactory"/>

</entry>

<entry key="/sms">

<ref bean="smsCodecFactory"/>

</entry>

代码太多,不全部贴出来,后面整理一下放到我的github上去。

基如此,我们还是得定义一个handler,继承simpleChannelUpstreamHander,并重写了messageReceied方法,具体在这里。

Java代码

QueryStringDecoder queryStringDecoder = new QueryStringDecoder(request.getUri())

String url = queryStringDecoder.getPath()

CodecFactory codecFactory = urlMaps.get(url)

if (null == codecFactory) {

logger.error("unsupported url:{} request.", url)

//sendError(ctx, BAD_REQUEST)

e.getChannel().close()

return

}

//获取cmwap网络中的手机号码

String phone = PhoneUtils.getPhone(request.getHeader("x-up-calling-line-id"))

if (request.getMethod().equals(HttpMethod.POST)) {

ChannelBuffer content = request.getContent()

String postParams = content.toString(CharsetUtil.UTF_8)

logger.debug("request content:{}", postParams)

ClientRequestModel model = (ClientRequestModel) codecFactory.decode(postParams)

model.setProperty(model.MESSAGE_EVENT_KEY, e)

model.setProperty(model.HTTP_REQUEST_KEY, request)

model.setProperty(model.HTTP_PHONE_KEY, phone)

InetSocketAddress remoteAddress = (InetSocketAddress) e.getRemoteAddress()

model.setProperty(model.IP_KEY, remoteAddress.getAddress().getHostAddress())

logger.info("user request model:{}", model)

model.fireSelf()

Java代码

@Override

public DomainMessage fireSelf() {

DomainMessage em = new DomainMessage(this)

EventUtils.fireEvent(em, "alipayNotifyState")

return em

}

看到这里基本上能够清楚了,是如何把客户端请求包装成ClientRequestModel了,且后面涉及到处理的对象,全部继承它,在整个架构之

中,has a 优于 is

a,对于客户端netty的一些对象,也是存储在ClientRequestModel中,codec无非也是采用了xml/json/kv,如斯,实现

了字节与对象之间的转换。

此之外,突然想到刚来杭州工作的第一家公司,基于此,采用的架构师servlet充当服务器,因为这是一个公司内部的server,而不是一个平台,采用

的数据格式也比较单一,就是xml,但是采用的外部类库也是xstream来处理的,但是整个系统维持的日调用量也是在百万级别,运用的client则是

采用httpclient,对于不同请求后面挂的handler,是在容器启动时加载到内存中,其余也没有什么亮点了。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/338593.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存