最近公司項目架構改變,以前的springmvc架構模式,改成了spring cloud ,要把springmvc架構弄成spring boot實現由於項目緊急,目前把其中一個springmvc的項目註冊到eureka上,後續在改成sping boot,那麼關鍵點來了,如何才能把spingmvc的項目註冊到eureka上呢,其實springboot項目註冊到eureka上,用到了spring-cloud-starter-eureka
,也是對Netflix eureka的封裝,那麼我們就在我們的springmvc中用到這個eurekaclientok了,我們spring cloud 用到的eureka 是1.4.12 ,所以在springmvc項目中引用該版本的jar
pom文件(由於與spirngmvc的項目jar衝突 ,我們把其中2個jar拆除掉)
<dependency>
<groupId>com.netflix.eureka</groupId>
<artifactId>eureka-client</artifactId>
<version>1.4.12</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</exclusion>
</exclusions>
</dependency>
java 代碼
package lisener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.appinfo.InstanceInfo.InstanceStatus;
import com.netflix.appinfo.MyDataCenterInstanceConfig;
import com.netflix.config.DynamicPropertyFactory;
import com.netflix.discovery.DefaultEurekaClientConfig;
import com.netflix.discovery.DiscoveryManager;
/**
*
*/
/**
* @author dell
*
*/
public class SampleEurekaService implements ServletContextListener{
private static final DynamicPropertyFactory configInstance = com.netflix.config.DynamicPropertyFactory
.getInstance();
private static final Logger logger = LoggerFactory
.getLogger(SampleEurekaService.class);
public void registerWithEureka() {
// Register with Eureka
DiscoveryManager.getInstance().initComponent(
new MyInstanceConfig(),
new DefaultEurekaClientConfig());
ApplicationInfoManager.getInstance().setInstanceStatus(
InstanceStatus.UP);
String vipAddress = configInstance.getStringProperty(
"eureka.vipAddress", "hmc-web.mydomain.net").get();
InstanceInfo nextServerInfo = null;
while (nextServerInfo == null) {
try {
nextServerInfo = DiscoveryManager.getInstance()
.getDiscoveryClient()
.getNextServerFromEureka(vipAddress, false);
} catch (Throwable e) {
System.out
.println("Waiting for service to register with eureka..");
try {
Thread.sleep(10000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
System.out.println("Service started and ready to process requests..");
// try {
// ServerSocket serverSocket = new ServerSocket(configInstance
// .getIntProperty("eureka.port", 8010).get());
// final Socket s = serverSocket.accept();
// System.out
// .println("Client got connected..Processing request from the client");
// processRequest(s);
//
//
// } catch (IOException e) {
// e.printStackTrace();
// }
// this.unRegisterWithEureka();
// System.out.println("Shutting down server.Demo over.");
}
public void unRegisterWithEureka() {
// Un register from eureka.
DiscoveryManager.getInstance().shutdownComponent();
}
private void processRequest(final Socket s) {
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String line = rd.readLine();
if (line != null) {
System.out.println("Received the request from the client.");
}
PrintStream out = new PrintStream(s.getOutputStream());
System.out.println("Sending the response to the client...");
out.println("Reponse at " + new Date());
} catch (Throwable e) {
System.err.println("Error processing requests");
} finally {
if (s != null) {
try {
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String args[]) {
SampleEurekaService sampleEurekaService = new SampleEurekaService();
sampleEurekaService.registerWithEureka();
}
/* (non-Javadoc)
* @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
registerWithEureka();
}
/* (non-Javadoc)
* @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
unRegisterWithEureka();
}
}
/**
*
*/
package lisener;
import java.net.InetAddress;
import java.net.UnknownHostException;
import com.netflix.appinfo.MyDataCenterInstanceConfig;
/**
* @author dell 讓註冊到服務的名稱是機器的ip ,非主機名
*
*/
public class MyInstanceConfig extends MyDataCenterInstanceConfig{
@Override
public String getHostName(boolean refresh) {
try {
return InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
return super.getHostName(refresh);
}
}
}
配置文件(只能叫config,eurekaclient只找這個文件名稱)
###Eureka Client configuration for Sample Eureka Service
#Properties based configuration for eureka client. The properties specified here is mostly what the users
#need to change. All of these can be specified as a java system property with -D option (eg)-Deureka.region=us-east-1
#For additional tuning options refer <url to go here>
#部署應用程序的區域
# - 對於AWS指定一個AWS區域
# - 對於其他數據中心,指定一個指示該區域的任意字符串。
# 這裏主要指定美國東部D
eureka.region=default
#服務指定應用名,這裏指的是eureka服務本身(相當於boot中的app.name)
eureka.name=hmc-web
#客戶識別此服務的虛擬主機名,這裏指的是eureka服務本身(相當於boot中的serviceId)
eureka.vipAddress=hmc-web.mydomain.net
#服務將被識別並將提供請求的端口(web服務部署的tomcat端口)
eureka.port=8080
#設置爲false,因爲該配置適用於eureka服務器本身的eureka客戶端。
#在eureka服務器中運行的eureka客戶端需要連接到其他區域中的服務器。
#對於其他應用程序,不應設置(默認爲true),以實現更好的基於區域的負載平衡。
eureka.preferSameZone=true
#如果要使用基於DNS的查找來確定其他eureka服務器(請參見下面的示例),請更改此選項
eureka.shouldUseDns=false
eureka.us-east-1.availabilityZones=default
#由於shouldUseDns爲false,因此我們使用以下屬性來明確指定到eureka服務器的路由(eureka Server地址)
eureka.serviceUrl.default=http\://localhost\:1111/eureka/
web.xml 加上
<listener>
<description>eureka監聽器</description>
<listener-class>lisener.SampleEurekaService</listener-class>
</listener>
測試
localhost:1111(這個是spring cloud 的eureka註冊項目),在頁面中可以看到我們的hmc-web(配置文件中指定)了。