Skip to content

Commit 0f18eb6

Browse files
xujinxujin
authored andcommitted
合并master
1 parent 669f61d commit 0f18eb6

File tree

304 files changed

+43123
-512
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

304 files changed

+43123
-512
lines changed

README.md

Lines changed: 25 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,9 @@ moss客户端主要用于内置预设自研端点和管理配置信息,使接
193193
194194
#### 2.3.1 Moss-Client
195195

196-
Moss客户端支持两种Spring Boot版本,分别是Spring Boot 1.5.X和Spring Boot 2.X,使用只需引入moss-client-starter即可。示例2.x的客户端如下所示。
196+
Moss客户端支持两种Spring Boot版本,分别是Spring Boot 1.5.X和Spring Boot 2.X,使用只需引入 moss-client 即可。示例2.x的客户端如下所示。
197197

198-
1.引入moss-client-starter
198+
1.引入 moss-client
199199

200200
```xml
201201
<dependency>
@@ -234,39 +234,13 @@ info.version: @project.version@
234234

235235
#### 2.3.2 导入IDE运行
236236

237-
1.创建数据库moss,执行sql文件:/Moss/doc/sql/moss-init.sql
238-
239-
2. 修改Moss/moss-web/src/main/resources/application.yml文件,数据库链接如下所示:
240-
241-
```yml
242-
spring:
243-
application:
244-
name: halo-moss
245-
datasource:
246-
url: jdbc:mysql://ip:端口/moss?useUnicode=true&characterEncoding=utf8
247-
## 生产用户名和密码
248-
username: 用户名
249-
password: 密码
250-
driver-class-name: com.mysql.jdbc.Driver
251-
type: com.alibaba.druid.pool.DruidDataSource
252-
filters: stat
253-
maxActive: 20
254-
initialSize: 1
255-
maxWait: 60000
256-
minIdle: 1
257-
timeBetweenEvictionRunsMillis: 60000
258-
minEvictableIdleTimeMillis: 300000
259-
validationQuery: select 'x'
260-
testWhileIdle: true
261-
testOnBorrow: false
262-
testOnReturn: false
263-
poolPreparedStatements: true
264-
maxOpenPreparedStatements: 20
265-
```
266-
267-
3.运行主程序org.xujin.moss.MossApplication.java
268-
269-
4.启动之后访问http://localhost:8080/,用户名:xujin和密码:123456
237+
1. 为方便快速演示,默认内置了 h2 数据库。
238+
3. 导入 IDEA 运行主程序org.xujin.moss.MossApplication.java
239+
4. 启动之后访问 http://localhost:8086/
240+
* 用户名 - xujin
241+
* 密码 - 123456
242+
5. 如需修改后端数据库,将 moss-web/src/main/resources/config/application.yml
243+
`spring.profiles.active` 的 h2 改为 mysql,并修改 application-mysql 中的连接地址、username/password。
270244

271245

272246
## 3.Moss的实现细节
@@ -282,40 +256,27 @@ spring:
282256
* 注册到Eureka上的应用名为大写,而注册到Nacos上的应用名为小写,Moss需要忽略大小写匹配
283257
* 等等~~~~~~~~~~~~~
284258

285-
## 4 GC日志路径设置:
259+
## 4 GC日志路径设置参考
286260

287-
-Xloggc:/opt/logs/gc.log -verbose.gc
261+
`-Xloggc:${YOUR_WORK_DIR}/logs/${APP_NAME}/gc.log -verbose.gc -XX:+PrintGCDateStamps`
288262

289-
### 4.1 切换支持单Nacos
263+
```yaml
264+
logging:
265+
registry:
266+
files:
267+
- name: gclog
268+
path: logs/${spring.application.name}/gc.log
269+
```
290270
291-
将moss-service/pom.xml中的依赖修改如下
292271
293-
```xml
294-
<dependency>
295-
<groupId>org.xujin.moss</groupId>
296-
<artifactId>moss-adapter-multi-eureka</artifactId>
297-
<version>1.0.0.RELEASE</version>
298-
</dependency>
299-
```
300-
修改为
301-
```xml
302-
<dependency>
303-
<groupId>org.xujin.moss</groupId>
304-
<artifactId>moss-adapter-single-nacos</artifactId>
305-
<version>1.0.0.RELEASE</version>
306-
</dependency>
307-
```
272+
### 4.1 切换支持注册中心
273+
默认的注册注册中心是 eureka,如果希望切换到其他注册中心,如 ZooKeeper,
274+
可以通过激活 profile 切换注册中心。在以下 pom 中已预设两种注册中心,使用时自行切换即可。
308275
309-
yml文件配置如下
310-
```yml
311-
spring:
312-
application:
313-
name: halo-moss
314-
cloud:
315-
nacos:
316-
discovery:
317-
server-addr: 127.0.0.1:8848
318-
```
276+
* moss-web/pom.xml
277+
* moss-service/pom.xml
278+
* moss-client/moss-sample-2.1.x
279+
* moss-client/moss-sample-1.5.x
319280
320281
## 5.致谢
321282
@@ -324,4 +285,3 @@ Moss中的moss-adapter-cloud和moss-core模块部分代码参考了 [Spring Boot
324285
## 6.Stargazers over time
325286
326287
[![Stargazers over time](https://starchart.cc/SpringCloud/Moss.svg)](https://starchart.cc/SpringCloud/Moss)
327-

moss-adapter/moss-adapter-multi-eureka/src/main/java/de/codecentric/boot/admin/server/cloud/extension/MossInstanceDiscoveryListener.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import de.codecentric.boot.admin.server.services.InstanceRegistry;
1313
import org.slf4j.Logger;
1414
import org.slf4j.LoggerFactory;
15+
import org.springframework.beans.factory.annotation.Autowired;
1516
import org.springframework.boot.context.event.ApplicationReadyEvent;
1617
import org.springframework.cloud.client.ServiceInstance;
1718
import org.springframework.cloud.client.discovery.event.HeartbeatEvent;
@@ -51,21 +52,24 @@ public class MossInstanceDiscoveryListener {
5152
* patterns (e.g. "foo*", "*foo", "foo*bar"). Default value is everything
5253
*/
5354
private Set<String> services = new HashSet<>(Collections.singletonList("*"));
54-
55+
private MultRegisterCenter multRegisterCenter;
5556
public MossInstanceDiscoveryListener(
5657
InstanceRegistry registry,
5758
InstanceRepository repository) {
5859
this.registry = registry;
5960
this.repository = repository;
6061
}
61-
62+
@Autowired
63+
public void setMultRegisterCenter(MultRegisterCenter multRegisterCenter) {
64+
this.multRegisterCenter = multRegisterCenter;
65+
}
6266
/**
6367
* 应用启动完Ready的事件
6468
* @param event
6569
*/
6670
@EventListener
6771
public void onApplicationReady(ApplicationReadyEvent event) {
68-
Map<String, MossEurekaAutoServiceRegistration> map= MultRegisterCenterServerMgmtConfig.getMultRegisterCenter().getMultRegistrationMap();
72+
Map<String, MossEurekaAutoServiceRegistration> map= multRegisterCenter.getMultRegistrationMap();
6973
map.entrySet().forEach(e -> {
7074
cloudEurekaClient.set(e.getValue().getRegistration().getEurekaClient());
7175
discover();
@@ -83,15 +87,15 @@ public void onInstanceRegistered(InstanceRegisteredEvent<?> event) {
8387

8488
@EventListener
8589
public void onParentHeartbeat(ParentHeartbeatEvent event) {
86-
HeartbeatMonitor heartbeatMonitor= MultRegisterCenterServerMgmtConfig.getHeartbeatMonitorByClient((CloudEurekaClient) event.getSource());
90+
HeartbeatMonitor heartbeatMonitor= getHeartbeatMonitorByClient((CloudEurekaClient) event.getSource());
8791
threadLocalmonitor.set(heartbeatMonitor);
8892
discoverIfNeeded((CloudEurekaClient) event.getSource(),event.getValue());
8993
threadLocalmonitor.remove();
9094
}
9195

9296
@EventListener
9397
public void onApplicationEvent(HeartbeatEvent event) {
94-
HeartbeatMonitor heartbeatMonitor= MultRegisterCenterServerMgmtConfig.getHeartbeatMonitorByClient((CloudEurekaClient) event.getSource());
98+
HeartbeatMonitor heartbeatMonitor= getHeartbeatMonitorByClient((CloudEurekaClient) event.getSource());
9599
threadLocalmonitor.set(heartbeatMonitor);
96100
discoverIfNeeded((CloudEurekaClient) event.getSource(),event.getValue());
97101
threadLocalmonitor.remove();
@@ -153,7 +157,7 @@ public List<String> getServicesByEureka() {
153157
protected Mono<Void> removeStaleInstances(Set<InstanceId> registeredInstanceIds) {
154158
return repository.findAll()
155159
.filter(Instance::isRegistered)
156-
.filter(instance -> MultRegisterCenterServerMgmtConfig.getCodeByClient(cloudEurekaClient.get()).
160+
.filter(instance -> getCodeByClient(cloudEurekaClient.get()).
157161
equals(instance.getRegistration().getSource()))
158162
.map(Instance::getId)
159163
.filter(id -> !registeredInstanceIds.contains(id))
@@ -162,7 +166,12 @@ protected Mono<Void> removeStaleInstances(Set<InstanceId> registeredInstanceIds)
162166
.then();
163167
}
164168

165-
169+
private String getCodeByClient(CloudEurekaClient client) {
170+
return multRegisterCenter.getMultEurekaCodeMap().get(client);
171+
}
172+
private HeartbeatMonitor getHeartbeatMonitorByClient(CloudEurekaClient client) {
173+
return multRegisterCenter.getMultHeartbeatMonitorMap().get(client);
174+
}
166175

167176

168177
protected boolean shouldRegisterService(final String serviceId) {
@@ -180,7 +189,7 @@ protected boolean matchesPattern(String serviceId, Set<String> patterns) {
180189
protected Mono<InstanceId> registerInstance(ServiceInstance instance) {
181190
try {
182191
Registration registration = converter.convert(instance).toBuilder().
183-
source(MultRegisterCenterServerMgmtConfig.getCodeByClient(cloudEurekaClient.get())).build();
192+
source(getCodeByClient(cloudEurekaClient.get())).build();
184193
log.debug("Registering discovered instance {}", registration);
185194
return registry.register(registration);
186195
} catch (Exception ex) {

moss-adapter/moss-adapter-multi-eureka/src/main/java/de/codecentric/boot/admin/server/cloud/extension/MossServerDiscoveryAutoConfiguration.java

Lines changed: 84 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,117 @@
11
package de.codecentric.boot.admin.server.cloud.extension;
22

3+
import com.google.common.collect.Maps;
4+
import com.netflix.appinfo.ApplicationInfoManager;
5+
import com.netflix.appinfo.HealthCheckHandler;
6+
import com.netflix.discovery.EurekaClient;
37
import de.codecentric.boot.admin.server.cloud.discovery.EurekaServiceInstanceConverter;
48
import de.codecentric.boot.admin.server.cloud.discovery.ServiceInstanceConverter;
59
import de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration;
610
import de.codecentric.boot.admin.server.config.AdminServerMarkerConfiguration;
711
import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
812
import de.codecentric.boot.admin.server.services.InstanceRegistry;
13+
import lombok.extern.slf4j.Slf4j;
14+
import org.moss.registry.adapter.MultRegisterCenterService;
15+
import org.springframework.beans.factory.ObjectProvider;
16+
import org.springframework.beans.factory.annotation.Autowired;
917
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
1018
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
1119
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1220
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
1321
import org.springframework.cloud.client.discovery.DiscoveryClient;
22+
import org.springframework.cloud.client.discovery.event.HeartbeatMonitor;
23+
import org.springframework.cloud.commons.util.InetUtils;
24+
import org.springframework.cloud.netflix.eureka.EurekaClientConfigBean;
25+
import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean;
26+
import org.springframework.cloud.netflix.eureka.metadata.ManagementMetadataProvider;
27+
import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration;
28+
import org.springframework.context.ApplicationContext;
1429
import org.springframework.context.annotation.Bean;
1530
import org.springframework.context.annotation.Configuration;
31+
import org.springframework.context.annotation.Primary;
32+
import org.springframework.core.env.ConfigurableEnvironment;
33+
34+
import java.util.Map;
35+
import java.util.concurrent.ConcurrentHashMap;
1636

1737
@Configuration
1838
@ConditionalOnSingleCandidate(DiscoveryClient.class)
1939
@ConditionalOnBean(AdminServerMarkerConfiguration.Marker.class)
2040
@AutoConfigureAfter(value = AdminServerAutoConfiguration.class, name = {
21-
"org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration",
22-
"org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration"})
41+
"org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration",
42+
"org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration"})
43+
@Slf4j
2344
public class MossServerDiscoveryAutoConfiguration {
45+
@Autowired
46+
private ConfigurableEnvironment env;
47+
@Autowired
48+
private InetUtils inetUtils;
49+
@Autowired
50+
private ApplicationContext context;
51+
@Autowired(required = false)
52+
private ObjectProvider<HealthCheckHandler> healthCheckHandler;
2453

2554
@Bean
2655
@ConditionalOnMissingBean
2756
public MossInstanceDiscoveryListener instanceDiscoveryListener(ServiceInstanceConverter serviceInstanceConverter,
28-
InstanceRegistry registry,
29-
InstanceRepository repository) {
57+
InstanceRegistry registry,
58+
InstanceRepository repository) {
3059
MossInstanceDiscoveryListener listener = new MossInstanceDiscoveryListener(registry, repository);
3160
listener.setConverter(serviceInstanceConverter);
3261
return listener;
3362
}
3463

64+
@Bean(destroyMethod = "shutdown")
65+
public MultRegisterCenter initMultEureka(MultRegisterCenterService multRegisterCenterService,
66+
MultRegisterCenterServerMgmtConfig mgmtConfig) {
67+
Map<String, String> URL_MAP;
68+
MultRegisterCenter multRegisterCenter;
69+
log.info("start init MultRegisterCenter");
70+
URL_MAP = multRegisterCenterService.getRegisterCenterList();
71+
if (URL_MAP.isEmpty()) {
72+
multRegisterCenter = new MultRegisterCenter(new ConcurrentHashMap<String, EurekaClient>(),
73+
new ConcurrentHashMap<String, MossEurekaAutoServiceRegistration>(),
74+
new ConcurrentHashMap<EurekaClient, HeartbeatMonitor>());
75+
return multRegisterCenter;
76+
}
77+
Map<String, EurekaClient> multEurekaMap = Maps.newConcurrentMap();
78+
Map<String, MossEurekaAutoServiceRegistration> multRegistrationMap = Maps.newConcurrentMap();
79+
Map<EurekaClient, HeartbeatMonitor> multHeartbeatMonitorMap = new ConcurrentHashMap<EurekaClient, HeartbeatMonitor>();
80+
URL_MAP.entrySet().forEach(e -> {
81+
log.info("start init eureka server:{}", e.getKey() + "-" + e.getValue());
82+
ManagementMetadataProvider managementMetadataProvider
83+
= mgmtConfig.serviceManagementMetadataProvider();
84+
EurekaClientConfigBean configBean
85+
= mgmtConfig.eurekaClientConfigBean(env);
86+
configBean.getServiceUrl().clear();
87+
configBean.getServiceUrl().put(EurekaClientConfigBean.DEFAULT_ZONE, e.getValue());
88+
EurekaInstanceConfigBean instanceConfigBean
89+
= mgmtConfig.eurekaInstanceConfigBean(inetUtils, env, managementMetadataProvider);
90+
instanceConfigBean.setEnvironment(env);
91+
ApplicationInfoManager manager
92+
= mgmtConfig.eurekaApplicationInfoManager(instanceConfigBean);
93+
EurekaClient eurekaClient
94+
= mgmtConfig.eurekaClient(manager, configBean);
95+
EurekaRegistration registration
96+
= mgmtConfig.eurekaRegistration(eurekaClient, instanceConfigBean, manager, healthCheckHandler);
97+
MossEurekaAutoServiceRegistration autoServiceRegistration
98+
= mgmtConfig.eurekaAutoServiceRegistration(context, mgmtConfig.eurekaServiceRegistry(), registration, registration);
99+
multEurekaMap.put(e.getKey(), eurekaClient);
100+
multRegistrationMap.put(e.getKey(), autoServiceRegistration);
101+
multHeartbeatMonitorMap.put(eurekaClient, new HeartbeatMonitor());
102+
log.info("init eureka server:{} end!", e.getKey() + "-" + e.getValue());
103+
});
104+
multRegisterCenter = new MultRegisterCenter(multEurekaMap, multRegistrationMap, multHeartbeatMonitorMap);
105+
log.info("init MultRegisterCenter End!");
106+
return multRegisterCenter;
107+
}
108+
109+
@Bean
110+
@Primary
111+
public MultRegisterCenterServerMgmtConfig multRegisterCenterServerMgmtConfig() {
112+
return new MultRegisterCenterServerMgmtConfig();
113+
}
114+
35115
@Configuration
36116
@ConditionalOnMissingBean({ServiceInstanceConverter.class})
37117
public static class EurekaConverterConfiguration {

0 commit comments

Comments
 (0)