集群与负载均衡系列——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共享问题,以后的文章会加上。
比如:
这里分别定义了两个集群,一个用来防止静态资源,一个是实际的服务,这样可以实现动静分离
比如:
这里配置了两个location,分别对应动态服务,和静态资源的服务器集群,并且为静态资源提供了缓存。location后可以接正则表达式过滤需要代理的文件
application-8080.yml
application-8888.yml
Application.java
BaseController.java
这里提供一个webserver,/port,将会返回该服务来自服务器的端口号
pom.xml
nginx配置
运行jar
java -jar 你打包的jar.名jar –spring.profiles.active=8080
java -jar 你打包的jar.名jar –spring.profiles.active=8888
启动nginx
多次访问http://localhost/port
发现8888和8080端口交替返回,说明负载均衡已经生效
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端口交替返回,说明负载均衡已经生效
相关文章推荐
- nginx整合tomcat实现负载均衡/集群(可用版)
- Ubuntu下基于Nginx实现Tomcat集群负载均衡
- 【转】Nginx系列(五)--nginx+tomcat实现负载均衡
- nginx + tomcat 集群实现负载均衡
- Nginx+tomcat实现集群和负载均衡
- linux下tomcat+nginx实现集群和负载均衡
- 使用apache和nginx代理实现tomcat负载均衡及集群配置详解
- 使用Nginx实现Tomcat集群负载均衡
- 使用apache和nginx代理实现tomcat负载均衡及集群配置详解
- Nginx+tomcat+redis实现tomcat集群负载均衡
- nginx+tomcat实现集群负载均衡(实现session复制)
- nginx+tomcat实现集群负载均衡(实现session复制)
- 【Linux运维-集群技术进阶】Nginx+Tomcat实现动静分离、负载均衡
- nginx + tomcat 集群实现负载均衡
- Nginx+Tomcat+Redis实现应用服务器集群负载均衡和Session共享
- 【Linux运维-集群技术进阶】Nginx+Tomcat实现Web服务器的负载均衡
- nginx + tomcat 集群实现负载均衡
- Nginx+tomcat实现集群跟负载均衡
- Nginx实现tomcat集群进行负载均衡
- 【整理】Nginx+Tomcat+Memcached实现服务器集群负载均衡