add app service interface

This commit is contained in:
mag 2015-04-02 10:31:03 +08:00
parent 09d960f01b
commit 35ef02b0ef
22 changed files with 476 additions and 351 deletions

View file

@ -223,11 +223,6 @@
<artifactId>commons-exec</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
<build>
<plugins>

View file

@ -1,5 +1,7 @@
package com.ctrip.zeus.client;
import com.ctrip.zeus.nginx.entity.NginxResponse;
import com.ctrip.zeus.nginx.entity.NginxServerStatus;
import com.ctrip.zeus.nginx.entity.UpstreamStatus;
import com.ctrip.zeus.nginx.transform.DefaultJsonParser;
@ -14,8 +16,9 @@ public class NginxClient extends AbstractRestClient {
super(url);
}
public void load() {
getTarget().path("/api/nginx/load").request().get(String.class);
public NginxResponse load() throws IOException{
String responseStr = getTarget().path("/api/nginx/load").request().get(String.class);
return DefaultJsonParser.parse(NginxResponse.class, responseStr);
}
public UpstreamStatus getUpstreamStatus() throws IOException {
@ -23,4 +26,9 @@ public class NginxClient extends AbstractRestClient {
System.out.println(result);
return DefaultJsonParser.parse(UpstreamStatus.class, result);
}
public NginxServerStatus getNginxServerStatus() throws IOException {
//TODO
return new NginxServerStatus();
}
}

View file

@ -1,5 +1,7 @@
package com.ctrip.zeus.nginx;
import com.ctrip.zeus.nginx.entity.NginxResponse;
import com.ctrip.zeus.nginx.entity.NginxServerStatus;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.PumpStreamHandler;
@ -56,8 +58,8 @@ public class NginxOperator {
String error = errorStream.toString("UTF-8");
NginxResponse response = new NginxResponse();
response.setOutMessage(out);
response.setErrMessage(error);
response.setOutMsg(out);
response.setErrMsg(error);
response.setSucceed(!failed);
return response;

View file

@ -1,57 +0,0 @@
package com.ctrip.zeus.nginx;
import com.google.gson.Gson;
/**
* User: mag
* Date: 3/24/2015
* Time: 1:39 PM
*/
public class NginxResponse {
private boolean succeed = true;
private String serverIP;
private String outMessage;
private String errMessage;
public boolean isSucceed() {
return succeed;
}
public void setSucceed(boolean succeed) {
this.succeed = succeed;
}
public String getServerIP() {
return serverIP;
}
public void setServerIP(String serverIP) {
this.serverIP = serverIP;
}
public String getOutMessage() {
return outMessage;
}
public void setOutMessage(String outMessage) {
this.outMessage = outMessage;
}
public String getErrMessage() {
return errMessage;
}
public void setErrMessage(String errMessage) {
this.errMessage = errMessage;
}
public String toJson(){
Gson gson = new Gson();
return gson.toJson(this);
}
public static NginxResponse fromJson(String jsonStr){
Gson gson = new Gson();
return gson.fromJson(jsonStr,NginxResponse.class);
}
}

View file

@ -1,27 +0,0 @@
package com.ctrip.zeus.nginx;
import com.google.gson.Gson;
/**
* User: mag
* Date: 3/24/2015
* Time: 1:32 PM
*/
public class NginxServerStatus {
private static enum Status{STARTED,STOPPED}
private String serverIP;
private Status status;
private int activeConnections;
public String toJson(){
Gson gson = new Gson();
return gson.toJson(this);
}
public static NginxServerStatus fromJson(String jsonStr){
Gson gson = new Gson();
return gson.fromJson(jsonStr,NginxServerStatus.class);
}
}

View file

@ -8,7 +8,7 @@ import com.ctrip.zeus.model.transform.DefaultSaxParser;
import com.ctrip.zeus.service.Activate.ActivateService;
import com.ctrip.zeus.service.build.BuildInfoService;
import com.ctrip.zeus.service.build.BuildService;
import com.ctrip.zeus.service.nginx.NginxAgentService;
import com.ctrip.zeus.service.nginx.NginxService;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Component;
@ -35,7 +35,7 @@ public class ActivateResource {
@Resource
private ActivateService activateConfService;
@Resource
private NginxAgentService nginxAgentService;
private NginxService nginxAgentService;
@Resource
private BuildInfoService buildInfoService;
@Resource
@ -94,7 +94,7 @@ public class ActivateResource {
if(buildService.build(buildslbName,ticket))
{
//Push Service
nginxAgentService.reloadConf(buildslbName);
nginxAgentService.loadAll(buildslbName);
}
}
}else {

View file

@ -1,7 +1,7 @@
package com.ctrip.zeus.restful.resource;
import com.ctrip.zeus.service.conf.ConfService;
import com.ctrip.zeus.service.nginx.NginxAgentService;
import com.ctrip.zeus.service.nginx.NginxService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@ -24,7 +24,7 @@ public class ConfResource {
@Resource
private ConfService confService;
@Resource
private NginxAgentService nginxAgentService;
private NginxService nginxAgentService;
@GET
@Path("/activate")
@ -35,6 +35,10 @@ public class ConfResource {
}
private void reloadNginxConf() {
nginxAgentService.reloadConf("default");
try {
nginxAgentService.loadAll("default");
} catch (Exception e) {
e.printStackTrace();
}
}
}

View file

@ -1,19 +1,21 @@
package com.ctrip.zeus.restful.resource;
import com.ctrip.zeus.nginx.NginxResponse;
import com.ctrip.zeus.nginx.NginxServerStatus;
import com.ctrip.zeus.service.SlbException;
import com.ctrip.zeus.nginx.entity.NginxResponse;
import com.ctrip.zeus.nginx.entity.NginxResponseList;
import com.ctrip.zeus.nginx.entity.NginxServerStatus;
import com.ctrip.zeus.nginx.entity.NginxServerStatusList;
import com.ctrip.zeus.service.nginx.NginxService;
import com.google.gson.Gson;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.util.List;
/**
@ -29,54 +31,71 @@ public class NginxResource {
@GET
@Path("/load")
@Produces({"*/*"})
public Response load() {
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response load(@Context HttpHeaders hh) {
try {
NginxResponse result = nginxService.load();
if (result.isSucceed()) {
return Response.ok(result.toJson()).type(MediaType.APPLICATION_JSON_TYPE).build();
if (MediaType.APPLICATION_XML_TYPE.equals(hh.getMediaType())) {
return Response.status(200).entity(String.format(NginxResponse.XML, result)).type(MediaType.APPLICATION_XML).build();
} else {
return Response.serverError().entity(result.toJson()).type(MediaType.APPLICATION_JSON_TYPE).build();
return Response.status(200).entity(String.format(NginxResponse.JSON, result)).type(MediaType.APPLICATION_JSON).build();
}
} catch (SlbException e) {
return Response.serverError().build();
}
}
@GET
@Path("/status")
@Produces({"*/*"})
public Response status() {
try {
NginxServerStatus status = nginxService.getStatus();
return Response.ok(status.toJson()).type(MediaType.APPLICATION_JSON_TYPE).build();
} catch (Exception e) {
return Response.serverError().build();
}
}
@GET
@Path("/loadAll")
@Produces({"*/*"})
public Response loadAll() {
@Path("/status")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response status(@Context HttpHeaders hh) {
try {
List<NginxResponse> result = nginxService.loadAll();
Gson gson = new Gson();
return Response.ok(gson.toJson(result)).type(MediaType.APPLICATION_JSON_TYPE).build();
NginxServerStatus status = nginxService.getStatus();
if (MediaType.APPLICATION_XML_TYPE.equals(hh.getMediaType())) {
return Response.status(200).entity(String.format(NginxServerStatus.XML, status)).type(MediaType.APPLICATION_XML).build();
} else {
return Response.status(200).entity(String.format(NginxServerStatus.JSON, status)).type(MediaType.APPLICATION_JSON).build();
}
} catch (Exception e) {
return Response.serverError().build();
}
}
@GET
@Path("/loadAll/slb/{slbName:[a-zA-Z0-9_-]+}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response loadAll(@Context HttpHeaders hh, @PathParam("slbName") String slbName) {
try {
List<NginxResponse> nginxResponseList = nginxService.loadAll(slbName);
NginxResponseList result = new NginxResponseList();
for (NginxResponse nginxResponse : nginxResponseList) {
result.addNginxResponse(nginxResponse);
}
if (MediaType.APPLICATION_XML_TYPE.equals(hh.getMediaType())) {
return Response.status(200).entity(String.format(NginxResponseList.XML, result)).type(MediaType.APPLICATION_XML).build();
} else {
return Response.status(200).entity(String.format(NginxResponseList.JSON, result)).type(MediaType.APPLICATION_JSON).build();
}
}catch (Exception e){
return Response.serverError().build();
}
}
@GET
@Path("/allStatus")
@Produces({"*/*"})
public Response allStatus() throws IOException {
@Path("/allStatus/slb/{slbName:[a-zA-Z0-9_-]+}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response allStatus(@Context HttpHeaders hh, @PathParam("slbName") String slbName) {
try {
List<NginxServerStatus> result = nginxService.getStatusAll();
Gson gson = new Gson();
return Response.ok(gson.toJson(result)).type(MediaType.APPLICATION_JSON_TYPE).build();
List<NginxServerStatus> nginxServerStatusList = nginxService.getStatusAll(slbName);
NginxServerStatusList result = new NginxServerStatusList();
for (NginxServerStatus nginxServerStatus : nginxServerStatusList) {
result.addNginxServerStatus(nginxServerStatus);
}
if (MediaType.APPLICATION_XML_TYPE.equals(hh.getMediaType())) {
return Response.status(200).entity(String.format(NginxServerStatusList.XML, result)).type(MediaType.APPLICATION_XML).build();
} else {
return Response.status(200).entity(String.format(NginxServerStatusList.JSON, result)).type(MediaType.APPLICATION_JSON).build();
}
}catch (Exception e){
return Response.serverError().build();
}

View file

@ -6,7 +6,7 @@ import com.ctrip.zeus.model.transform.DefaultSaxParser;
import com.ctrip.zeus.service.build.BuildInfoService;
import com.ctrip.zeus.service.build.BuildService;
import com.ctrip.zeus.service.model.SlbRepository;
import com.ctrip.zeus.service.nginx.NginxAgentService;
import com.ctrip.zeus.service.nginx.NginxService;
import com.ctrip.zeus.service.status.StatusService;
import org.springframework.stereotype.Component;
import org.xml.sax.SAXException;
@ -37,7 +37,7 @@ public class ServerResource {
@Resource
private BuildInfoService buildInfoService;
@Resource
private NginxAgentService nginxAgentService;
private NginxService nginxAgentService;
@Resource
private SlbRepository slbClusterRepository;
@ -70,7 +70,7 @@ public class ServerResource {
int ticket = buildInfoService.getTicket(slbname);
if(buildService.build(slbname,ticket))
{
nginxAgentService.reloadConf(slbname);
nginxAgentService.loadAll(slbname);
}
}
@ -108,7 +108,7 @@ public class ServerResource {
//build config
if (buildService.build(slbname, ticket)) {
//push
nginxAgentService.reloadConf(slbname);
nginxAgentService.loadAll(slbname);
}
}
}
@ -145,7 +145,7 @@ public class ServerResource {
if(buildService.build(slbname,ticket))
{
//push
nginxAgentService.reloadConf(slbname);
nginxAgentService.loadAll(slbname);
}
}
@ -185,7 +185,7 @@ public class ServerResource {
//build config
if (buildService.build(slbname, ticket)) {
//push
nginxAgentService.reloadConf(slbname);
nginxAgentService.loadAll(slbname);
}
}
}

View file

@ -1,17 +1,22 @@
package com.ctrip.zeus.restful.resource;
import com.ctrip.zeus.model.entity.AppServerStatus;
import com.ctrip.zeus.model.entity.AppStatus;
import com.ctrip.zeus.model.entity.AppStatusList;
import com.ctrip.zeus.service.status.AppStatusService;
import com.ctrip.zeus.service.status.StatusService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.List;
/**
* @author:xingchaowang
@ -22,17 +27,98 @@ import javax.ws.rs.core.Response;
public class StatusResource {
@Resource
private StatusService statusService;
private AppStatusService appStatusService;
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response status(@Context HttpHeaders hh) {
AppStatusList appStatusList = null;//statusService.getAllAppStatus("default");
public Response allAppStatus(@Context HttpHeaders hh) {
try {
List<AppStatus> statusList = appStatusService.getAllAppStatus();
AppStatusList result = new AppStatusList();
for (AppStatus appStatus : statusList) {
result.addAppStatus(appStatus);
}
if (MediaType.APPLICATION_XML_TYPE.equals(hh.getMediaType())) {
return Response.status(200).entity(String.format(AppStatusList.XML, result)).type(MediaType.APPLICATION_XML).build();
} else {
return Response.status(200).entity(String.format(AppStatusList.JSON, result)).type(MediaType.APPLICATION_JSON).build();
}
}catch (Exception e){
return Response.status(500).build();
}
}
@GET
@Path("/slb/{slbName:[a-zA-Z0-9_-]+}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response allAppStatusInSlb(@Context HttpHeaders hh, @PathParam("slbName") String slbName) {
try {
List<AppStatus> statusList = appStatusService.getAllAppStatus(slbName);
AppStatusList result = new AppStatusList();
for (AppStatus appStatus : statusList) {
result.addAppStatus(appStatus);
}
if (MediaType.APPLICATION_XML_TYPE.equals(hh.getMediaType())) {
return Response.status(200).entity(String.format(AppStatusList.XML, result)).type(MediaType.APPLICATION_XML).build();
} else {
return Response.status(200).entity(String.format(AppStatusList.JSON, result)).type(MediaType.APPLICATION_JSON).build();
}
}catch (Exception e){
return Response.status(500).build();
}
}
@GET
@Path("/app/{appName:[a-zA-Z0-9_-]+}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response appStatus(@Context HttpHeaders hh, @PathParam("appName") String appName) {
try {
List<AppStatus> statusList = appStatusService.getAppStatus(appName);
AppStatusList result = new AppStatusList();
for (AppStatus appStatus : statusList) {
result.addAppStatus(appStatus);
}
if (MediaType.APPLICATION_XML_TYPE.equals(hh.getMediaType())) {
return Response.status(200).entity(String.format(AppStatusList.XML, result)).type(MediaType.APPLICATION_XML).build();
} else {
return Response.status(200).entity(String.format(AppStatusList.JSON, result)).type(MediaType.APPLICATION_JSON).build();
}
}catch (Exception e){
return Response.status(500).build();
}
}
@GET
@Path("/app/{appName:[a-zA-Z0-9_-]+}/slb/{slbName:[a-zA-Z0-9_-]+}}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response appSlbStatus(@Context HttpHeaders hh, @PathParam("appName") String appName, @PathParam("slbName") String slbName) {
try{
AppStatus appStatus = appStatusService.getAppStatus(appName,slbName);
if (MediaType.APPLICATION_XML_TYPE.equals(hh.getMediaType())) {
return Response.status(200).entity(String.format(AppStatusList.XML, appStatusList)).type(MediaType.APPLICATION_XML).build();
return Response.status(200).entity(String.format(AppStatusList.XML, appStatus)).type(MediaType.APPLICATION_XML).build();
} else {
return Response.status(200).entity(String.format(AppStatusList.JSON, appStatusList)).type(MediaType.APPLICATION_JSON).build();
return Response.status(200).entity(String.format(AppStatusList.JSON, appStatus)).type(MediaType.APPLICATION_JSON).build();
}
}catch (Exception e){
return Response.status(500).build();
}
}
@GET
@Path("/app/{appName:[a-zA-Z0-9_-]+}/slb/{slbName:[a-zA-Z0-9_-]+}}/server/{sip:[a-zA-Z0-9_-]+}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response appServerStatus(@Context HttpHeaders hh, @PathParam("appName") String appName, @PathParam("slbName") String slbName,@PathParam("sip") String sip) {
try {
AppServerStatus appServerStatus = appStatusService.getAppServerStatus(appName, slbName, sip);
if (MediaType.APPLICATION_XML_TYPE.equals(hh.getMediaType())) {
return Response.status(200).entity(String.format(AppStatusList.XML, appServerStatus)).type(MediaType.APPLICATION_XML).build();
} else {
return Response.status(200).entity(String.format(AppStatusList.JSON, appServerStatus)).type(MediaType.APPLICATION_JSON).build();
}
} catch (Exception e){
return Response.status(500).build();
}
}
}

View file

@ -1,20 +0,0 @@
package com.ctrip.zeus.service;
/**
* User: mag
* Date: 3/26/2015
* Time: 10:33 AM
*/
public class SlbException extends Exception{
public SlbException(){
super();
}
public SlbException(String message, Throwable t){
super(message,t);
}
public SlbException(Throwable t){
super(t);
}
}

View file

@ -1,9 +0,0 @@
package com.ctrip.zeus.service.nginx;
/**
* @author:xingchaowang
* @date: 3/17/2015.
*/
public interface NginxAgentService {
void reloadConf(String slbName);
}

View file

@ -1,8 +1,7 @@
package com.ctrip.zeus.service.nginx;
import com.ctrip.zeus.nginx.NginxResponse;
import com.ctrip.zeus.nginx.NginxServerStatus;
import com.ctrip.zeus.service.SlbException;
import com.ctrip.zeus.nginx.entity.NginxResponse;
import com.ctrip.zeus.nginx.entity.NginxServerStatus;
import java.util.List;
@ -11,12 +10,28 @@ import java.util.List;
* @date: 3/8/2015.
*/
public interface NginxService {
NginxResponse load() throws SlbException;
/**
* load the colocated nginx server conf
* @return
* @throws Exception
*/
NginxResponse load() throws Exception;
NginxServerStatus getStatus() throws SlbException;
/**
* fetch the status of colocated nginx server status
* @return
* @throws Exception
*/
NginxServerStatus getStatus() throws Exception;
List<NginxResponse> loadAll() throws SlbException;
/**
* load all nginx server conf in the slb
* @param slbName
* @return
* @throws Exception
*/
List<NginxResponse> loadAll(String slbName) throws Exception;
List<NginxServerStatus> getStatusAll() throws SlbException;
List<NginxServerStatus> getStatusAll(String slbName) throws Exception;
}

View file

@ -1,43 +0,0 @@
package com.ctrip.zeus.service.nginx.impl;
import com.ctrip.zeus.client.NginxClient;
import com.ctrip.zeus.dal.core.NginxServerDao;
import com.ctrip.zeus.dal.core.NginxServerDo;
import com.ctrip.zeus.dal.core.NginxServerEntity;
import com.ctrip.zeus.service.nginx.NginxAgentService;
import org.springframework.stereotype.Service;
import org.unidal.dal.jdbc.DalException;
import javax.annotation.Resource;
import java.util.List;
/**
* @author:xingchaowang
* @date: 3/17/2015.
*/
@Service("nginxAgentService")
public class NginxAgentServiceImpl implements NginxAgentService {
@Resource
private NginxServerDao nginxServerDao;
@Override
public void reloadConf(String slbName) {
try {
List<NginxServerDo> list = nginxServerDao.findAllBySlbName(slbName, NginxServerEntity.READSET_FULL);
for (NginxServerDo d : list) {
System.out.println(d.getIp() + "###");
NginxClient nginxClient = new NginxClient("http://"+d.getIp() + ":8099");
try {
nginxClient.load();
System.out.println(d.getIp());
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

View file

@ -1,10 +1,18 @@
package com.ctrip.zeus.service.nginx.impl;
import com.ctrip.zeus.dal.core.*;
import com.ctrip.zeus.nginx.NginxResponse;
import com.ctrip.zeus.nginx.NginxServerStatus;
import com.ctrip.zeus.client.NginxClient;
import com.ctrip.zeus.dal.core.NginxServerDao;
import com.ctrip.zeus.dal.core.NginxServerDo;
import com.ctrip.zeus.dal.core.NginxServerEntity;
import com.ctrip.zeus.model.entity.NginxConfServerData;
import com.ctrip.zeus.model.entity.NginxConfUpstreamData;
import com.ctrip.zeus.model.entity.Slb;
import com.ctrip.zeus.model.entity.SlbServer;
import com.ctrip.zeus.nginx.NginxOperator;
import com.ctrip.zeus.service.SlbException;
import com.ctrip.zeus.nginx.entity.NginxResponse;
import com.ctrip.zeus.nginx.entity.NginxServerStatus;
import com.ctrip.zeus.service.build.NginxConfService;
import com.ctrip.zeus.service.model.SlbRepository;
import com.ctrip.zeus.service.nginx.NginxService;
import com.ctrip.zeus.util.S;
import com.netflix.config.DynamicIntProperty;
@ -12,15 +20,9 @@ import com.netflix.config.DynamicPropertyFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.unidal.dal.jdbc.DalException;
import javax.annotation.Resource;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
@ -34,39 +36,30 @@ public class NginxServiceImpl implements NginxService {
private static DynamicIntProperty adminServerPort = DynamicPropertyFactory.getInstance().getIntProperty("server.port", 8099);
@Resource
private NginxServerDao nginxServerDao;
@Resource
private SlbDao slbDao;
@Resource
private BuildInfoDao buildInfoDao;
@Resource
private NginxConfDao nginxConfDao;
@Resource
private NginxConfServerDao nginxConfServerDao;
@Resource
private NginxConfUpstreamDao nginxConfUpstreamDao;
private SlbRepository slbRepository;
@Resource
private NginxConfService nginxConfService;
@Resource
private NginxServerDao nginxServerDao;
@Override
public NginxResponse load() throws SlbException {
public NginxResponse load() throws Exception {
String ip = S.getIp();
try {
NginxServerDo nginxServerDo = nginxServerDao.findByIp(ip, NginxServerEntity.READSET_FULL);
SlbDo slbDo = slbDao.findByName(nginxServerDo.getSlbName(), SlbEntity.READSET_FULL);
String slbName = slbDo.getName();
BuildInfoDo buildInfoDo = buildInfoDao.findByName(slbName, BuildInfoEntity.READSET_FULL);
int version = buildInfoDo.getCurrentTicket();
Slb slb = slbRepository.getBySlbServer(ip);
String slbName = slb.getName();
int version = nginxConfService.getCurrentVersion(slbName);
NginxOperator nginxOperator = new NginxOperator(slbDo.getNginxConf(), slbDo.getNginxBin());
NginxOperator nginxOperator = new NginxOperator(slb.getNginxConf(), slb.getNginxBin());
writeConfToDisk(slbName, version, nginxOperator);
// reload configuration
NginxResponse response = reloadConf(nginxOperator);
// update the used version in the db
NginxServerDo nginxServerDo =nginxServerDao.findByIp(ip, NginxServerEntity.READSET_FULL);
nginxServerDao.updateByPK(nginxServerDo.setVersion(version), NginxServerEntity.UPDATESET_FULL);
return response;
} catch (Exception e){
LOGGER.error("Fail to update and reload configuration.",e);
throw new SlbException(e);
}
}
private NginxResponse reloadConf(NginxOperator nginxOperator) throws IOException {
@ -74,7 +67,7 @@ public class NginxServiceImpl implements NginxService {
return nginxOperator.reloadConf();
}
private void writeConfToDisk(String slbName, int version, NginxOperator nginxOperator) throws DalException, IOException {
private void writeConfToDisk(String slbName, int version, NginxOperator nginxOperator) throws Exception {
LOGGER.info("Start writing nginx configuration.");
// write nginx conf
writeNginxConf(slbName, version, nginxOperator);
@ -85,111 +78,70 @@ public class NginxServiceImpl implements NginxService {
}
@Override
public NginxServerStatus getStatus() throws SlbException {
try {
public NginxServerStatus getStatus() throws Exception {
String ip = S.getIp();
NginxServerDo nginxServerDo = nginxServerDao.findByIp(ip, NginxServerEntity.READSET_FULL);
SlbDo slbDo = slbDao.findByName(nginxServerDo.getSlbName(), SlbEntity.READSET_FULL);
NginxOperator nginxOperator = new NginxOperator(slbDo.getNginxConf(), slbDo.getNginxBin());
Slb slb = slbRepository.getBySlbServer(ip);
NginxOperator nginxOperator = new NginxOperator(slb.getNginxConf(), slb.getNginxBin());
return nginxOperator.getRuntimeStatus();
}catch (Exception e){
LOGGER.error("Fail to get nginx status",e);
throw new SlbException(e);
}
}
@Override
public List<NginxResponse> loadAll() throws SlbException {
try {
public List<NginxResponse> loadAll(String slbName) throws Exception {
List<NginxResponse> result = new ArrayList<>();
String ip = S.getIp();
Slb slb = slbRepository.get(slbName);
List<SlbServer> slbServers = slb.getSlbServers();
for (SlbServer slbServer : slbServers) {
if (ip.equals(slbServer.getIp())) {
result.add(load());
NginxServerDo nginxServerDo = nginxServerDao.findByIp(ip, NginxServerEntity.READSET_FULL);
List<NginxServerDo> serverList = nginxServerDao.findAllBySlbName(nginxServerDo.getSlbName(), NginxServerEntity.READSET_FULL);
for (NginxServerDo serverDo : serverList) {
if (ip.equals(serverDo.getIp())) {
continue;
}
String responseStr = request(buildRemoteUrl(serverDo.getIp(), "/nginx/load"));
NginxResponse response = NginxResponse.fromJson(responseStr);
NginxClient nginxClient = new NginxClient(buildRemoteUrl(slbServer.getIp()));
NginxResponse response = nginxClient.load();
result.add(response);
}
return result;
}catch (Exception e){
LOGGER.error("error happens when load nginx conf",e);
throw new SlbException(e);
}
}
@Override
public List<NginxServerStatus> getStatusAll() throws SlbException {
try {
public List<NginxServerStatus> getStatusAll(String slbName) throws Exception {
List<NginxServerStatus> result = new ArrayList<>();
String ip = S.getIp();
Slb slb = slbRepository.get(slbName);
for (SlbServer slbServer : slb.getSlbServers()) {
if (ip.equals(slbServer.getIp())) {
result.add(getStatus());
NginxServerDo nginxServerDo = nginxServerDao.findByIp(ip, NginxServerEntity.READSET_FULL);
List<NginxServerDo> serverList = nginxServerDao.findAllBySlbName(nginxServerDo.getSlbName(), NginxServerEntity.READSET_FULL);
for (NginxServerDo serverDo : serverList) {
if (ip.equals(serverDo.getIp())) {
continue;
}
String responseStr = request(buildRemoteUrl(serverDo.getIp(), "/nginx/load"));
NginxServerStatus response = NginxServerStatus.fromJson(responseStr);
NginxClient nginxClient = new NginxClient(buildRemoteUrl(slbServer.getIp()));
NginxServerStatus response = nginxClient.getNginxServerStatus();
result.add(response);
}
return result;
}catch (Exception e){
LOGGER.error("error happens when load nginx conf",e);
throw new SlbException(e);
}
}
private String buildRemoteUrl(String ip, String uri) {
return "http://" + ip + ":" + adminServerPort.get() + uri;
private String buildRemoteUrl(String ip) {
return "http://" + ip + ":" + adminServerPort.get();
}
private String request(String urlStr) throws IOException {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(10000);
conn.setReadTimeout(1000 * 20);
conn.setRequestMethod("GET");
InputStream inputStream = conn.getInputStream();
String res = consumeStream(inputStream);
inputStream.close();
return res;
}
private String consumeStream(InputStream inputStream) throws IOException {
BufferedInputStream bis = new BufferedInputStream(inputStream);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
int result = bis.read();
while (result != -1) {
byte b = (byte) result;
buf.write(b);
result = bis.read();
}
return buf.toString();
}
private void writeNginxConf(String slbName, int version, NginxOperator nginxOperator) throws DalException, IOException {
String nginxConf = nginxConfDao.findBySlbNameAndVersion(slbName,version, NginxConfEntity.READSET_FULL).getContent();
private void writeNginxConf(String slbName, int version, NginxOperator nginxOperator) throws Exception {
String nginxConf = nginxConfService.getNginxConf(slbName, version);
nginxOperator.writeNginxConf(nginxConf);
}
private void writeServerConf(String slbName, int version, NginxOperator nginxOperator) throws DalException, IOException {
List<NginxConfServerDo> nginxConfServerDoList = nginxConfServerDao.findAllBySlbNameAndVersion(slbName, version, NginxConfServerEntity.READSET_FULL);
for (NginxConfServerDo d : nginxConfServerDoList) {
private void writeServerConf(String slbName, int version, NginxOperator nginxOperator) throws Exception {
List<NginxConfServerData> nginxConfServerDataList = nginxConfService.getNginxConfServer(slbName, version);
for (NginxConfServerData d : nginxConfServerDataList) {
nginxOperator.writeServerConf(d.getName(), d.getContent());
}
}
private void writeUpstreamConf(String slbName, int version, NginxOperator nginxOperator) throws DalException, IOException {
List<NginxConfUpstreamDo> nginxConfUpstreamDoList = nginxConfUpstreamDao.findAllBySlbNameAndVersion(slbName, version, NginxConfUpstreamEntity.READSET_FULL);
for (NginxConfUpstreamDo d : nginxConfUpstreamDoList) {
private void writeUpstreamConf(String slbName, int version, NginxOperator nginxOperator) throws Exception {
List<NginxConfUpstreamData> nginxConfUpstreamList = nginxConfService.getNginxConfUpstream(slbName, version);
for (NginxConfUpstreamData d : nginxConfUpstreamList) {
nginxOperator.writeUpstreamsConf(d.getName(), d.getContent());
}
}

View file

@ -0,0 +1,34 @@
package com.ctrip.zeus.service.status;
import com.ctrip.zeus.model.entity.AppServerStatus;
import com.ctrip.zeus.model.entity.AppStatus;
import java.util.List;
/**
* User: mag
* Date: 4/1/2015
* Time: 10:54 AM
*/
public interface AppStatusService {
/**
* Find all app status
* @return
* @throws Exception
*/
List<AppStatus> getAllAppStatus() throws Exception;
/**
* Find all app status in the specific slb cluster
* @param slbName
* @return
* @throws Exception
*/
List<AppStatus> getAllAppStatus(String slbName) throws Exception;
List<AppStatus> getAppStatus(String appName) throws Exception;
AppStatus getAppStatus(String appName,String slbName) throws Exception;
AppServerStatus getAppServerStatus(String appName, String slbName, String ip) throws Exception;
}

View file

@ -0,0 +1,120 @@
package com.ctrip.zeus.service.status.impl;
import com.ctrip.zeus.client.NginxClient;
import com.ctrip.zeus.model.entity.AppServerStatus;
import com.ctrip.zeus.model.entity.AppSlb;
import com.ctrip.zeus.model.entity.AppStatus;
import com.ctrip.zeus.model.entity.Slb;
import com.ctrip.zeus.nginx.entity.S;
import com.ctrip.zeus.nginx.entity.UpstreamStatus;
import com.ctrip.zeus.service.model.AppRepository;
import com.ctrip.zeus.service.model.SlbRepository;
import com.ctrip.zeus.service.status.AppStatusService;
import com.ctrip.zeus.service.status.StatusService;
import com.netflix.config.DynamicIntProperty;
import com.netflix.config.DynamicPropertyFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* User: mag
* Date: 4/1/2015
* Time: 2:26 PM
*/
@Service("appStatusService")
public class AppStatusServiceImpl implements AppStatusService {
private static DynamicIntProperty nginxStatusPort = DynamicPropertyFactory.getInstance().getIntProperty("slb.nginx.status-port", 10001);
@Resource
SlbRepository slbRepository;
@Resource
AppRepository appRepository;
@Resource
StatusService statusService;
@Override
public List<AppStatus> getAllAppStatus() throws Exception {
List<AppStatus> result = new ArrayList<>();
List<Slb> slbList = slbRepository.list();
for (Slb slb : slbList) {
result.addAll(getAllAppStatus(slb.getName()));
}
return result;
}
@Override
public List<AppStatus> getAllAppStatus(String slbName) throws Exception {
List<AppStatus> result = new ArrayList<>();
List<AppSlb> appSlbs = slbRepository.listAppSlbsBySlb(slbName);
for (AppSlb appSlb : appSlbs) {
AppStatus appStatus = getAppStatus(appSlb.getAppName(), appSlb.getSlbName());
result.add(appStatus);
}
return result;
}
@Override
public List<AppStatus> getAppStatus(String appName) throws Exception {
List<AppStatus> result = new ArrayList<>();
List<Slb> slbList = slbRepository.listByApps(new String[]{appName});
for (Slb slb : slbList) {
String slbName = slb.getName();
result.add(getAppStatus(appName,slbName));
}
return result;
}
@Override
public AppStatus getAppStatus(String appName, String slbName) throws Exception {
AppStatus status = new AppStatus();
status.setAppName(appName);
status.setSlbName(slbName);
List<String> appServerList = appRepository.listAppServersByApp(appName);
for (String appServer : appServerList) {
AppServerStatus serverStatus = getAppServerStatus(appName, slbName, appServer);
status.addAppServerStatus(serverStatus);
}
return status;
}
@Override
public AppServerStatus getAppServerStatus(String appName, String slbName, String ip) throws Exception {
AppServerStatus appServerStatus = new AppServerStatus();
appServerStatus.setIp(ip);
boolean memberUp = statusService.getAppServerStatus(slbName,appName,ip);
boolean serverUp = statusService.getServerStatus(ip);
boolean backendUp = getUpstreamStatus(ip);
appServerStatus.setServer(serverUp);
appServerStatus.setMember(memberUp);
appServerStatus.setUp(backendUp);
return appServerStatus;
}
//TODO: should include port to get accurate upstream
private boolean getUpstreamStatus(String ip) throws IOException {
NginxClient nginxClient = new NginxClient("127.0.0.1:" + nginxStatusPort.get());
UpstreamStatus upstreamStatus = nginxClient.getUpstreamStatus();
List<S> servers = upstreamStatus.getServers().getServer();
for (S server : servers) {
String ipPort = server.getName();
String[] ipPorts = ipPort.split(":");
if (ipPorts.length == 2){
if (ipPorts[0].equals(ip)){
return "up".equalsIgnoreCase(server.getStatus());
}
}
}
return false;
}
}

View file

@ -102,6 +102,7 @@
</entity>
<entity name="app-status">
<element name="app-name" value-type="String" />
<element name="slb-name" value-type="String" />
<entity-ref name="app-server-status" type="list" names="app-server-statuses" />
</entity>
<entity name="app-server-status">

View file

@ -2,6 +2,10 @@
<model>
<entity name="nginx" root="true">
<entity-ref name="upstream-status" />
<entity-ref name="nginx-response" />
<entity-ref name="nginx-server-status" />
<entity-ref name="nginx-response-list" />
<entity-ref name="nginx-server-status-list" />
</entity>
<entity name="upstream-status">
<entity-ref name="servers" />
@ -21,5 +25,24 @@
<element name="type" value-type="String" />
<element name="port" value-type="int" />
</entity>
<entity name="nginx-response">
<element name="succeed" value-type="boolean" />
<element name="server-ip" value-type="String" />
<element name="err-msg" value-type="String" />
<element name="out-msg" value-type="String" />
</entity>
<entity name="nginx-server-status">
<element name="server-ip" value-type="String" />
<element name="status" value-type="String" />
<element name="active-connections" value-type="int" />
</entity>
<entity name="nginx-response-list">
<element name="total" value-type="int" />
<entity-ref name="nginx-response" type="list" names="nginx-responses" xml-indent="true" />
</entity>
<entity name="nginx-server-status-list">
<element name="total" value-type="int" />
<entity-ref name="nginx-server-status" type="list" names="nginx-server-statuses" xml-indent="true" />
</entity>
</model>

View file

@ -1,10 +1,6 @@
package com.ctrip.zeus.nginx;
import com.ctrip.zeus.model.entity.*;
import com.ctrip.zeus.nginx.conf.ConfWriter;
import com.ctrip.zeus.nginx.conf.NginxConf;
import com.ctrip.zeus.nginx.conf.ServerConf;
import com.ctrip.zeus.nginx.conf.UpstreamsConf;
import org.junit.Test;
import java.io.IOException;

View file

@ -99,6 +99,7 @@
<app-status>
<app-name>app1</app-name>
<slb-name>default</slb-name>
<app-server-status>
<ip>192.168.1.1</ip>
<port>80</port>

View file

@ -27,4 +27,29 @@
</server>
</servers>
</upstream-status>
<nginx-response>
<succeed>true</succeed>
<server-ip>127.0.0.1</server-ip>
<err-msg>error</err-msg>
<out-msg></out-msg>
</nginx-response>
<nginx-server-status>
<server-ip>127.0.0.1</server-ip>
<status>up</status>
<active-connections>100</active-connections>
</nginx-server-status>
<nginx-response-list>
<total>11</total>
<nginx-responses>
<nginx-response/>
<nginx-response/>
</nginx-responses>
</nginx-response-list>
<nginx-server-status-list>
<total>11</total>
<nginx-server-statuses>
<nginx-server-status/>
<nginx-server-status/>
</nginx-server-statuses>
</nginx-server-status-list>
</nginx>