您的位置:首页 > 运维架构 > Tomcat

集群与负载均衡系列——nginx实现tomcat集群与负载均衡(1)

2017-04-26 00:00 573 查看
开个新的系列,研究集群与负载均衡,预想该系列大致内容如下:

nginx+tomcat,dubbo+zookeeper,spring-cloud+ducker,mysql主从,redis主从,分布式查询和分布式事务atomikos。并且包括集群中的session共享问题解决,ip hash法和缓存法。另外再加一个消息队列。在这里不准备研究除了http协议以外的其它服务分布式通信方式,比如hessian。

先来个开篇吧,nginx集群tomcat,这也是用的很多的方式。对于更复杂的分布式服务,需要引进服务中心的概念,就有了dubbo+zookeeper。然而近年来,spring出了一个更加牛逼的东西,spring-cloud用来解决分布式的问题。很多大公司已经开始转战spring-cloud,具体可以到spring-cloud的中国开源社区了解,并可以加qq群。

闲话不说了,现在开始介绍具体配置,这篇文章不包含session共享问题,以后的文章会加上。

配置服务器集群

服务器集群可以通过upstream配置,可以配置多个集群,主体中配置具体服务和负载均衡策略,比如可以用iphash,权重,默认是轮询。

比如:

upstream  dynamic{  #服务器集群名字
server    xxx.xxx.xxx.xxx:80  weight=1;#服务器配置   weight是权重的意思,权重越大,分配的概率越大。
server    xxx.xxx.xxx.xxx:80  weight=2;
}

upstream  static{  #服务器集群名字
server    xxx.xxx.xxx.xxx:80  weight=1;#服务器配置   weight是权重的意思,权重越大,分配的概率越大。
server    xxx.xxx.xxx.xxx:80  weight=2;
}



这里分别定义了两个集群,一个用来防止静态资源,一个是实际的服务,这样可以实现动静分离

代理服务

配置完集群以后,就需要实际的服务去实现了,需要配置server,其中包括listen监听的端口号,server_name服务名,location资源定位和集群的关系

比如:

server {
listen       80;
server_name  localhost;
location / {
proxy_pass http://upstream; proxy_redirect default;
}
location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
proxy_cache cache_one;
proxy_cache_valid 200 304 302 5d;
proxy_cache_valid any 5d;
proxy_cache_key '$host:$server_port$request_uri';
add_header X-Cache '$upstream_cache_status from $host';
proxy_pass http://static; expires 30d; #缓存30天
}
}


这里配置了两个location,分别对应动态服务,和静态资源的服务器集群,并且为静态资源提供了缓存。location后可以接正则表达式过滤需要代理的文件

例子

用spring-boot创建一个webserver,分别打包为8080端口和8888端口

application-8080.yml

server:
port: 8080


application-8888.yml

server:
port: 8888


Application.java

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

@SpringBootApplication
public class Application {

public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}

}


BaseController.java

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

@RestController
public class BaseController {

@Value("${server.port}")
private String port;

@RequestMapping(value = "/port",
method = RequestMethod.GET,
produces = MediaType.TEXT_PLAIN_VALUE+";charset=UTF-8")
public void getPort(HttpServletRequest request,HttpServletResponse response){
writeJson(port,response);
}

public void writeJson(Object object,HttpServletResponse response)
{
try
{
//DisableCircularReferenceDetect避免$ref问题
String json = JSON.toJSONStringWithDateFormat(object, "yyyy-MM-dd HH:mm:ss",SerializerFeature.DisableCircularReferenceDetect);
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(json);
System.out.println("123"+port);
response.getWriter().flush();
}
catch (IOException e)
{
e.printStackTrace();
}
}

}


这里提供一个webserver,/port,将会返回该服务来自服务器的端口号

pom.xml

<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>wlf-demo</groupId>
<artifactId>web-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<type>pom</type>
<version>1.3.5.RELEASE</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.28</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>


nginx配置

#服务器的集群
upstream  tomcat {  #服务器集群名字
server    127.0.0.1:8080  weight=1;#服务器配置   weight是权重的意思,权重越大,分配的概率越大。
server    127.0.0.1:8888  weight=2;
}

server {
listen       80;
server_name  localhost;

location / {
proxy_pass http://tomcat; proxy_redirect default;
}
}


运行jar

java -jar 你打包的jar.名jar –spring.profiles.active=8080

java -jar 你打包的jar.名jar –spring.profiles.active=8888

启动nginx

多次访问http://localhost/port





发现8888和8080端口交替返回,说明负载均衡已经生效
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息