本文共 9181 字,大约阅读时间需要 30 分钟。
server: port: 7001spring: application: name: eureka-servereureka: instance: hostname: localhost client: register-with-eureka: false fetch-registry: false serviceUrl: defaultZone: http://localhost:7001/eureka/
server: port: 7001 # 高可用配置 groups: - name: server port: 7001 - name: server2 port: 7002 spring: application: name: server eureka: instance: hostname: localhost client: serviceUrl: defaultZone: http://localhost:7001/eureka/
4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.12.RELEASE ./ com.example eureka-server 0.0.1-SNAPSHOT Demo project for Spring Boot 1.8 org.springframework.cloud spring-cloud-starter-netflix-eureka-server org.springframework.cloud spring-cloud-dependencies Greenwich.SR6 pom import
server: port: 9002 ssl: enabled: true key-alias: tomcat key-store: classpath:keystore.p12 key-store-password: 222333 keyStoreType: PKCS12spring: application: name: product feign: hystrix: enabled: true
server: port: 6443 ssl: enabled: true key-alias: tomcat key-store: classpath:keystore.p12 key-store-password: 222333 keyStoreType: PKCS12
server: port: 6001 ssl: enabled: true key-alias: tomcat key-store: classpath:keystore.p12 key-store-password: 222333 keyStoreType: PKCS12
spring: application: name: gateway cloud: gateway: discovery: locator: enabled: true httpclient: ssl: use-insecure-trust-manager: true
package com.example.demo.config;import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory;import org.springframework.boot.web.server.WebServer;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.server.reactive.HttpHandler;@Configuration@ConditionalOnProperty(name = "https.server.ssl.enabled", havingValue = "true")public class HttpsConfig { @Bean @ConfigurationProperties(prefix = "https.server") public HttpsProperties httpsProperties() { return new HttpsProperties(); } @Bean(initMethod = "start", destroyMethod = "stop") public WebServer httpWebServer(HttpHandler handler, HttpsProperties properties) { NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory(properties.getPort()); factory.setSsl(properties.getSsl()); return factory.getWebServer(handler); }} package com.example.demo.config;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory;import org.springframework.boot.web.server.Ssl;import org.springframework.boot.web.server.WebServer;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ClassPathResource;import org.springframework.http.server.reactive.HttpHandler;import java.io.File;import java.io.IOException;@Configuration@ConditionalOnProperty(name = "https.server.ssl.enabled", havingValue = "true")public class HttpsConfig { @Value("${https.server.port:6443}") private int httpsPort; @Value("${https.server.ssl.key-alias:'tomcat'}") private String keyAlias; @Value("${https.server.ssl.key-store:'classpath:keystore.p12'}") private String keyStore; @Value("${https.server.ssl.key-store-password:'222333'}") private String keyStorePassword; @Value("${https.server.ssl.keyStoreType:'PKCS12'}") private String keyStoreType; @Bean(initMethod = "start", destroyMethod = "stop") public WebServer httpWebServer(HttpHandler handler) { NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory(httpsPort); File keyStoreFile; try { keyStoreFile = new ClassPathResource(keyStore).getFile(); } catch (IOException ex) { throw new IllegalStateException("Can't access keystore: [" + keyStore + "] or truststore: [" + keyStore + "]", ex); } Ssl ssl = new Ssl(); ssl.setEnabled(true); ssl.setKeyAlias(keyAlias); ssl.setKeyStore(keyStoreFile.getAbsolutePath()); ssl.setKeyStorePassword(keyStorePassword); ssl.setKeyStoreType(keyStoreType); factory.setSsl(ssl); return factory.getWebServer(handler); }} package com.example.product.util;import lombok.extern.Slf4j;import org.springframework.stereotype.Component;import org.springframework.util.StringUtils;import javax.websocket.*;import javax.websocket.server.PathParam;import javax.websocket.server.ServerEndpoint;import java.io.IOException;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;@Component@ServerEndpoint(value = "/ws/{token}")public class WebSocketServer { private static Map clientMap = new ConcurrentHashMap<>(); private String token; private Session session; @OnOpen public void onOpen(@PathParam("token") String token, Session session) { this.token = token; this.session = session; addOnlineCount(); clientMap.put(token, this); log.info("New connection joined! Token: {}, Session ID: {}, Current connections: {}", token, session.getId(), onlineCount); } @OnClose public void onClose() { subOnlineCount(); clientMap.remove(token); log.info("One connection closed. Current connections: {}", onlineCount); } @OnMessage public void onMessage(String message, Session session) throws IOException { log.info("Received message from client: {}", message); sendMsgToAll(message); } @OnError public void onError(Session session, Throwable error) { log.info("Error occurred!"); error.printStackTrace(); } public void sendMessage(String token, String message) throws IOException { if (!StringUtils.isEmpty(token) && clientMap.containsKey(token)) { clientMap.get(token).send(message); log.info("Successfully sent a message: {}", message); } else { log.error("User '{}' is not online!", token); } } public void send(String message) throws IOException { this.session.getBasicRemote().sendText(message); } public void sendMsgToAll(String message) throws IOException { for (WebSocketServer item : clientMap.values()) { item.session.getBasicRemote().sendText(message); } log.info("Successfully sent message to all: {}", onlineCount); } public static synchronized int getOnlineCount() { return WebSocketServer.onlineCount; } public static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; }} package com.example.product.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configurationpublic class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); }} 错误日志示例:
Caused by: java.io.FileNotFoundException: class path resource [keystore.p12] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/home/gateway-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/keystore.p12ClassPathResource
解决方法:
错误信息示例:
io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
解决方法:
通过以上配置和优化,可以有效提升微服务架构的安全性和性能,同时确保各服务之间的通信顺畅。
转载地址:http://wntjz.baihongyu.com/