Compare commits

..

34 Commits

Author SHA1 Message Date
liaochuntao ae79de4b97
Merge pull request #38 from chuntaojun/1.x
1.x
2019-07-25 12:14:14 +08:00
chuntaojun 3cc49b3d8e fix(config): fix NacosConfigAutoConfiguration 2019-07-25 11:45:33 +08:00
chuntaojun 7b78753758 fix(config): remove beanfactory register singleton object 2019-07-25 11:43:12 +08:00
chuntaojun 4e102e56d1 fix: 2019-07-25 11:31:40 +08:00
chuntaojun f94a675959 refactor: update version to 0.1.2 2019-07-25 11:26:39 +08:00
liaochuntao 842b0e2135
Merge pull request #33 from chuntaojun/1.x
support new feature and fix issue #18
2019-07-19 11:45:22 +08:00
chuntaojun c63c09f580 ci: 2019-07-19 11:42:20 +08:00
chuntaojun 9e91534831 ci: 2019-07-19 11:31:19 +08:00
chuntaojun 8baae0e520 ci: 2019-07-19 11:27:34 +08:00
chuntaojun 5b389c1b84 ci: 2019-07-19 11:06:26 +08:00
chuntaojun 4eeb85fc6f ci: 2019-07-19 11:02:48 +08:00
chuntaojun c5bce068fa fix(config): remove unuse package 2019-07-19 10:58:02 +08:00
chuntaojun 8b3f1a37c2 feat: 2019-07-19 10:51:43 +08:00
chuntaojun 844242b493 feat(config): support new nacos-client feature and spring-nacos-project feature 2019-07-19 10:41:12 +08:00
chuntaojun 0a9f54f215 feat: 2019-07-19 09:35:14 +08:00
fangjian0423 21972f263b fix test case for 1.x branch 2019-01-29 16:13:08 +08:00
fangjian0423 483271f2ee remove sk in healthindicator and endpoint 2019-01-16 11:39:27 +08:00
fangjian0423 77a0b1ef6d remove duplicate maven plugin 2018-12-13 20:42:39 +08:00
fangjian0423 5bfc05876a update version for 1.x branch 2018-12-13 20:32:37 +08:00
fangjian0423 050d10ab5a add conditional to NacosConfigAutoConfiguration, NacosDiscoveryAutoConfiguration for springboot 1.x 2018-09-26 21:51:35 +08:00
format c5498e440d
Update README.md 2018-09-26 19:04:51 +08:00
fangjian0423 546dd7df39 Integrate with Travis CI 2018-09-26 17:44:34 +08:00
fangjian0423 6cf028d929 Integrate with Travis CI 2018-09-26 17:41:00 +08:00
fangjian0423 83e0bc6809 update nacos spring version 2018-09-26 17:29:58 +08:00
fangjian0423 d839e5c9a6 Integrate with Travis CI 2018-09-26 17:24:34 +08:00
fangjian0423 1f7bcb2736 add nacos server detail info in health indicator 2018-09-25 15:46:19 +08:00
fangjian0423 e4c4d39f18 update samples 2018-09-25 15:17:33 +08:00
fangjian0423 4ff3b44268 modify conditional class in nacos config, discovery actuator 2018-09-25 15:17:21 +08:00
fangjian0423 8fc2b59dbe fix test case 2018-09-22 14:32:07 +08:00
fangjian0423 b84631340f Update documents 2018-09-20 11:44:08 +08:00
fangjian0423 09833490d2 Update documents 2018-09-20 11:39:55 +08:00
fangjian0423 21f9944b6f modify nacos config sample, update docs, modify endpoints 2018-09-19 16:37:20 +08:00
fangjian0423 ac97b09c18 Update documents 2018-09-18 21:23:27 +08:00
fangjian0423 a28b60f1b3 commit 1.x branch to support springboot 1.x 2018-09-18 17:36:53 +08:00
129 changed files with 1717 additions and 11402 deletions

2
.gitignore vendored
View File

@ -29,5 +29,3 @@ hs_err_pid*
.settings .settings
target target
.DS_Store
.flattened-pom.xml

View File

@ -6,10 +6,12 @@ notifications:
on_success: change on_success: change
on_failure: always on_failure: always
dist: trusty
language: java language: java
jdk: jdk:
- openjdk10
- openjdk8 - openjdk8
- openjdk7
script: script:

View File

@ -1,206 +0,0 @@
## Nacos AOT
### prerequisites
- GraalVM22.0+ (JDK17)
- native-image
- Nacos Server
If you haven't downloaded GraalVM, you can download it from [Download GraalVM](https://www.graalvm.org/downloads/).
If you don't have a native-image environment, you can configure according to [Native Image](https://www.graalvm.org/latest/reference-manual/native-image/).
You have to start a Nacos Server in backend , If you don't know steps, you can learn about [quick start](https://nacos.io/en-us/docs/quick-start.html).
### Quick Start
The complete code for this example can be found at: [`nacos-aot-sample`](nacos-spring-boot-samples/nacos-aot-sample)
1. Because SpringBoot2 does not support aot, you must specify SpringBoot as SpringBoot3 in dependency management:
```xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.0.6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
```
2. You would add [`nacos-config-spring-boot-starter`](nacos-config-spring-boot-starter) or [`nacos-discovery-spring-boot-starter`](nacos-discovery-spring-boot-starter) in your Spring application's dependencies :
```xml
<dependencies>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
```
3. In order to use the process-aot feature of SpringBoot and more conveniently compile native-image programs, we also need `spring-boot-maven-plugin` and `native-maven-plugin`:
```xml
<profiles>
<profile>
<id>native</id>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>0.9.25</version>
<executions>
<execution>
<id>compile</id>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<configuration>
<classesDirectory>${project.build.outputDirectory}</classesDirectory>
<mainClass>com.alibaba.boot.nacos.sample.AotApplication</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>process-aot</id>
<goals>
<goal>process-aot</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
```
4. You could define some configurations in `application.properties`:
```properties
nacos.config.server-addr=localhost:8848
nacos.discovery.server-addr=localhost:8848
```
> `nacos.config.server-addr` and `nacos.discovery.server-addr` attribute configure "\${host}:${port}" of your Nacos Server
5. You could using `@SpringBootApplication` to annotate main class like normal SpringBoot Application and startup:
```java
@SpringBootApplication
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class AotApplication {
public static void main(String[] args) {
SpringApplication.run(AotApplication.class, args);
}
}
```
Note: `@NacosPropertySource` is used to specify the data-id of the configuration.
6. Let's try the functions of `@NacosInjected` and `@NacosValue`, for more usage, see [Nacos Spring Project](https://github.com/nacos-group/nacos-spring-project).
```java
@Controller
public class AotController {
@NacosInjected
private ConfigService configService;
@NacosInjected
private NamingService namingService;
@NacosValue(value = "${flag:false}", autoRefreshed = true)
private boolean flag;
@ResponseBody
@RequestMapping(value = "/config/get", method = GET)
public String getConfig() throws NacosException {
return configService.getConfig("example", "DEFAULT_GROUP", 5000);
}
@ResponseBody
@RequestMapping(value = "/naming/get", method = GET)
public List<Instance> getNaming(@RequestParam("serviceName") String serviceName) throws NacosException {
return namingService.getAllInstances(serviceName);
}
@ResponseBody
@RequestMapping(value = "/flag/get", method = GET)
public boolean getFlag() {
return flag;
}
}
```
7. Publish the configuration to the Nacos Server by calling the Nacos Open API, with dataId of example and content of `flag=true`
```shell
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example&group=DEFAULT_GROUP&content=flag=true"
```
8. Enable the tracing agent on the command line with the `java` command from the GraalVM JDK:
```shell
$JAVA_HOME/bin/java -agentlib:native-image-agent=config-output-dir=/path/to/config-dir/ ...
```
Note: For more information about tracing agent, see [Collect Metadata with the Tracing Agent](https://www.graalvm.org/latest/reference-manual/native-image/metadata/AutomaticMetadataCollection/).
9. Run the java program and follow the steps below to use the program:
1. Open `localhost:8080/config/get` with a browser, and the browser responds with `flag=true`.
2. Open `localhost:8080/flag/get` with a browser, and the browser responds with `true`.
3. Publish the configuration to the Nacos Server by calling the Nacos Open API, with dataId of example and content of `flag=false`
```shell
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example&group=DEFAULT_GROUP&content=flag=false"
```
4. Open `localhost:8080/flag/get` with a browser, and the browser responds with `false`.
5. Register a service named example with Nacos server by calling Nacos Open API.
```shell
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=example&ip=127.0.0.1&port=8080'
```
6. Open `localhost:8080/naming/get?serviceName=example` with a browser, and the browser responds with information about the service you just registered.
10. Close the program and copy the file just generated to the `classpath:META-INF/native-image/` folder, The file path is specified in step 8.
Note: [`nacos-aot-sample`](nacos-spring-boot-samples/nacos-aot-sample) already includes these files, but you can still use the files you just generated.
11. Run the following command and you will find the compiled executable program in the `target` folder.
```shell
mvn -DskipTests=true clean package -Pnative
```
12. This executable program is what we want! Run the program and try step 9 again.
## Relative Projects
* [Alibaba Nacos](https://github.com/alibaba/nacos)
* [Alibaba Spring Context Support](https://github.com/alibaba/spring-context-support)
* [Nacos Spring Project](https://github.com/nacos-group/nacos-spring-project)
* [Nacos Spring Cloud Project](https://github.com/spring-cloud-incubator/spring-cloud-alibaba)

View File

@ -1,144 +0,0 @@
### Nacos Config
First, you have to start a Nacos Server in backend , If you don't know steps, you can learn about [quick start](https://nacos.io/en-us/docs/quick-start.html).
Suppose your Nacos Server is startup, you would add [`nacos-config-spring-boot-starter`](nacos-config-spring-boot-starter) in your Spring application's dependencies :
```xml
<dependencies>
...
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
...
</dependencies>
```
Note: Version [0.2.x.RELEASE](https://mvnrepository.com/artifact/com.alibaba.boot/nacos-config-spring-boot-starter) is compatible with the Spring Boot 2.x and the Spring Boot 3.x. Version [0.1.x.RELEASE](https://mvnrepository.com/artifact/com.alibaba.boot/nacos-config-spring-boot-starter) is compatible with the Spring Boot 1.x.
After that, you could define some configurations in `application.properties`:
```properties
nacos.config.server-addr=localhost:8848
```
> `nacos.config.server-addr` attribute configures "\${host}:${port}" of your Nacos Server
Then you could using `@SpringBootApplication` to annotate main class like normal SpringBoot Application and startup:
```java
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
```
If you'd like to use "Distributed Configuration" features, `ConfigService` is a core service interface to get or publish config, you could use "Dependency Injection" to inject `ConfigService` instance in your Spring Beans.
```java
@Service
public class ConfigServiceDemo {
@NacosInjected
private ConfigService configService;
public void demoGetConfig() {
try {
String dataId = "{dataId}";
String group = "{group}";
String content = configService.getConfig(dataId, groupId, 5000);
System.out.println(content);
} catch (NacosException e) {
e.printStackTrace();
}
}
...
}
```
above code equals below one:
```java
try {
// Initialize the configuration service, and the console automatically obtains the following parameters through the sample code.
String serverAddr = "{serverAddr}";
String dataId = "{dataId}";
String group = "{group}";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
// Actively get the configuration.
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
} catch (NacosException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
```
## Endpoint
Nacos config starter support the implementation of Spring Boot actuator endpoints.
**Prerequisite:**
Adding `nacos-config-spring-boot-actuator` to your pom.xml in Nacos Config Project.
Then Configure your endpoint security strategy.
* Spring Boot1.x
```properties
management.security.enabled=false
```
* Spring Boot2.x or Spring Boot3.x
```properties
management.endpoints.web.exposure.include=*
```
To view the endpoint information, visit the following URLS:
* Spring Boot1.x: URL is http://127.0.0.1:10011/nacos-config.
* Spring Boot2.x or Spring Boot3.x: URL is http://127.0.0.1:10011/actuator/nacos-config.
## Health Checks
`nacos-config-spring-boot-actuator` support the standard Spring Boot `HealthIndicator` as a production-ready feature , which will be aggregated into Spring Boot's `Health` and exported on `HealthEndpoint` that works MVC (Spring Web MVC) if it is available.
Suppose a Spring Boot Web application did not specify `management.server.port`(SpringBoot1.x using `management.port`), you can access http://localhost:{port}/actuator/health (SpringBoot1.x visit http://localhost:{port}/health) via Web Client and will get a response with JSON format is like below :
```json
{
"status": "UP",
"details": {
"nacosConfig": {
"status": "UP"
},
"diskSpace": {
"status": "UP",
"details": {
"total": 250140434432,
"free": 52323512320,
"threshold": 10485760
}
}
}
}
```
For more information about Nacos Spring, see [Nacos Spring Project](https://github.com/nacos-group/nacos-spring-project).
## Relative Projects
* [Alibaba Nacos](https://github.com/alibaba/nacos)
* [Alibaba Spring Context Support](https://github.com/alibaba/spring-context-support)
* [Nacos Spring Project](https://github.com/nacos-group/nacos-spring-project)
* [Nacos Spring Cloud Project](https://github.com/spring-cloud-incubator/spring-cloud-alibaba)

View File

@ -1,131 +0,0 @@
### Nacos Discovery
First, you have to start a Nacos Server in backend , If you don't know steps, you can learn about [quick start](https://nacos.io/en-us/docs/quick-start.html).
Suppose your Nacos Server is startup, you would add [`nacos-discovery-spring-boot-starter`](nacos-discovery-spring-boot-starter) in your Spring application's dependencies :
```xml
<dependencies>
...
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
...
</dependencies>
```
Note: Version [0.2.x.RELEASE](https://mvnrepository.com/artifact/com.alibaba.boot/nacos-discovery-spring-boot-starter) is compatible with the Spring Boot 2.x and the Spring Boot 3.x. Version [0.1.x.RELEASE](https://mvnrepository.com/artifact/com.alibaba.boot/nacos-discovery-spring-boot-starter) is compatible with the Spring Boot 1.x.
After that, you could define some configurations in `application.properties`:
```properties
nacos.discovery.server-addr=localhost:8848
```
> `nacos.discovery.server-addr` attribute configures "\${host}:${port}" of your Nacos Server
Then you could using `@SpringBootApplication` to annotate main class like normal SpringBoot Application and startup:
```java
@SpringBootApplication
public class DiscoveryApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryApplication.class, args);
}
}
```
If you'd like to use "Service Registry" features, `NamingService` is a core service interface to get or publish config, you could use "Dependency Injection" to inject `NamingService` instance in your Spring Beans.
```java
@Service
public class NamingServiceDemo {
@NacosInjected
private NamingService namingService;
public void demoRegisterService() {
try {
namingService.registerInstance("test-service", "1.1.1.1", 8080);
} catch (NacosException e) {
e.printStackTrace();
}
}
...
}
```
above code equals below one:
```java
try {
// Initialize the naming service, and the console automatically obtains the following parameters through the sample code.
String serverAddr = "{serverAddr}";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
NamingService naming = NamingFactory.createNamingService(properties);
namingService.registerInstance("test-service", "1.1.1.1", 8080);
} catch (NacosException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
```
For more information about Nacos Spring, see [Nacos Spring Project](https://github.com/nacos-group/nacos-spring-project).
## Endpoint
Nacos discovery starter also support the implementation of Spring Boot actuator endpoints.
**Prerequisite:**
Adding `nacos-discovery-spring-boot-actuator` to your pom.xml in Nacos Discovery Project.
Then Configure your endpoint security strategy.
* Spring Boot1.x
```properties
management.security.enabled=false
```
* Spring Boot2.x or Spring Boot3.x
```properties
management.endpoints.web.exposure.include=*
```
To view the endpoint information, visit the following URLS:
* Spring Boot1.x: URL is http://127.0.0.1:10012/nacos-discovery.
* Spring Boot2.x or Spring Boot3.x: URL is http://127.0.0.1:10012/actuator/nacos-discovery.
## Health Checks
`nacos-discovery-spring-boot-actuator` support the standard Spring Boot `HealthIndicator` as a production-ready feature , which will be aggregated into Spring Boot's `Health` and exported on `HealthEndpoint` that works MVC (Spring Web MVC) if it is available.
Suppose a Spring Boot Web application did not specify `management.server.port`(SpringBoot1.x using `management.port`), you can access http://localhost:{port}/actuator/health (SpringBoot1.x visit http://localhost:{port}/health) via Web Client and will get a response with JSON format is like below :
```json
{
"status": "UP",
"details": {
"nacosDiscovery": {
"status": "UP"
},
"diskSpace": {
"status": "UP",
"details": {
"total": 250140434432,
"free": 52323680256,
"threshold": 10485760
}
}
}
}
```

252
README.md
View File

@ -18,48 +18,276 @@ Nacos Spring Boot Project consist of two parts: `nacos-config-spring-boot` and `
`nacos-discovery-spring-boot` module is using for Service Discovery, Service Health Check and Dynamic DNS Service. `nacos-discovery-spring-boot` module is using for Service Discovery, Service Health Check and Dynamic DNS Service.
Additionally, Nacos Spring Boot Project already supports native-image.
## Samples ## Samples
- [Nacos Config Sample](https://github.com/nacos-group/nacos-spring-boot-project/tree/master/nacos-spring-boot-samples/nacos-config-sample) - [Nacos Config Sample](https://github.com/nacos-group/nacos-spring-boot-project/tree/master/nacos-spring-boot-samples/nacos-config-sample)
- [Nacos Discovery Sample](https://github.com/nacos-group/nacos-spring-boot-project/tree/master/nacos-spring-boot-samples/nacos-discovery-sample) - [Nacos Discovery Sample](https://github.com/nacos-group/nacos-spring-boot-project/tree/master/nacos-spring-boot-samples/nacos-discovery-sample)
- [Nacos AOT Sample](https://github.com/nacos-group/nacos-spring-boot-project/tree/master/nacos-spring-boot-samples/nacos-aot-sample)
## Dependencies & Compatibility ## Dependencies & Compatibility
**Version: 0.2.x / 2.x.x ( branch master )** **master branch**
| Dependencies | Compatibility | | Dependencies | Compatibility |
| -------------- | ------------- | | -------------- | ------------- |
| Java | 1.8+ | | Java | 1.8+ |
| Spring Boot | 2.0.3.RELEASE | | Spring Boot | 2.0.3.RELEASE |
| Nacos-Spring-Context | 1.1.0 |
**Version: 0.1.x / 1.x.x ( branch: 1.x )** **1.x branch**
| Dependencies | Compatibility | | Dependencies | Compatibility |
| -------------- | ------------- | | -------------- | ------------- |
| Java | 1.7+ | | Java | 1.7+ |
| Spring Boot | 1.4.1.RELEASE | | Spring Boot | 1.4.1.RELEASE |
| Nacos-Spring-Context | 1.1.0 |
## Quick Start ## Quick Start
### Nacos Config
- [Nacos Config Quick Start](https://github.com/nacos-group/nacos-spring-boot-project/blob/master/NACOS-CONFIG-QUICK-START.md) First, you have to start a Nacos Server in backend , If you don't know steps, you can learn about [quick start](https://nacos.io/en-us/docs/quick-start.html).
- [Nacos Discovery Quick Start](https://github.com/nacos-group/nacos-spring-boot-project/blob/master/NACOS-DISCOVERY-QUICK-START.md) Suppose your Nacos Server is startup, you would add [`nacos-config-spring-boot-starter`](nacos-config-spring-boot-starter) in your Spring application's dependencies :
- [Nacos AOT Quick Start](https://github.com/nacos-group/nacos-spring-boot-project/blob/master/NACOS-AOT-QUICK-START.md) ```xml
<dependencies>
...
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
...
</dependencies>
```
After that, you could define some configurations in `application.properties`:
```properties
nacos.config.server-addr=localhost
```
> `nacos.config.server-addr` attribute configures "\${host}:${port}" of your Nacos Server
Then you could using `@SpringBootApplication` to annotate main class like normal SpringBoot Application and startup:
```java
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
```
If you'd like to use "Distributed Configuration" features, `ConfigService` is a core service interface to get or publish config, you could use "Dependency Injection" to inject `ConfigService` instance in your Spring Beans.
```java
@Service
public class ConfigServiceDemo {
@NacosInjected
private ConfigService configService;
public void demoGetConfig() {
try {
String dataId = "{dataId}";
String group = "{group}";
String content = configService.getConfig(dataId, groupId, 5000);
System.out.println(content);
} catch (NacosException e) {
e.printStackTrace();
}
}
...
}
```
above code equals below one:
```java
try {
// Initialize the configuration service, and the console automatically obtains the following parameters through the sample code.
String serverAddr = "{serverAddr}";
String dataId = "{dataId}";
String group = "{group}";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
// Actively get the configuration.
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
} catch (NacosException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
```
### Nacos Discovery
First, you have to start a Nacos Server in backend , If you don't know steps, you can learn about [quick start](https://nacos.io/en-us/docs/quick-start.html).
Suppose your Nacos Server is startup, you would add [`nacos-discovery-spring-boot-starter`](nacos-discovery-spring-boot-starter) in your Spring application's dependencies :
```xml
<dependencies>
...
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
...
</dependencies>
```
After that, you could define some configurations in `application.properties`:
```properties
nacos.discovery.server-addr=localhost
```
> `nacos.discovery.server-addr` attribute configures "\${host}:${port}" of your Nacos Server
Then you could using `@SpringBootApplication` to annotate main class like normal SpringBoot Application and startup:
```java
@SpringBootApplication
public class DiscoveryApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryApplication.class, args);
}
}
```
If you'd like to use "Service Registry" features, `NamingService` is a core service interface to get or publish config, you could use "Dependency Injection" to inject `NamingService` instance in your Spring Beans.
```java
@Service
public class NamingServiceDemo {
@NacosInjected
private NamingService namingService;
public void demoRegisterService() {
try {
namingService.registerInstance("test-service", "1.1.1.1", 8080);
} catch (NacosException e) {
e.printStackTrace();
}
}
...
}
```
above code equals below one:
```java
try {
// Initialize the naming service, and the console automatically obtains the following parameters through the sample code.
String serverAddr = "{serverAddr}";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
NamingService naming = NamingFactory.createNamingService(properties);
namingService.registerInstance("test-service", "1.1.1.1", 8080);
} catch (NacosException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
```
For more information about Nacos Spring, see [Nacos Spring Project](https://github.com/nacos-group/nacos-spring-project).
## Endpoint
Nacos config starter and Nacos discovery starter also support the implementation of Spring Boot actuator endpoints.
**Prerequisite:**
Adding `nacos-config-spring-boot-actuator` to your pom.xml in Nacos Config Project.
Adding `nacos-discovery-spring-boot-actuator` to your pom.xml in Nacos Discovery Project.
Then Configure your endpoint security strategy.
* Spring Boot1.x
```properties
management.security.enabled=false
```
* Spring Boot2.x
```properties
management.endpoints.web.exposure.include=*
```
To view the endpoint information, visit the following URLS:
Nacos Config Project :
* Spring Boot1.x: Nacos Config Endpoint URL is http://127.0.0.1:10011/nacos-config.
* Spring Boot2.x: Nacos Config Endpoint URL is http://127.0.0.1:10011/actuator/nacos-config.
Nacos Discovery Project:
* Spring Boot1.x: Nacos Discovery Endpoint URL is http://127.0.0.1:10012/nacos-discovery.
* Spring Boot2.x: Nacos Discovery Endpoint URL is http://127.0.0.1:10012/actuator/nacos-discovery.
## Health Checks
`nacos-config-spring-boot-actuator` and `nacos-discovery-spring-boot-actuator` support the standard Spring Boot `HealthIndicator` as a production-ready feature , which will be aggregated into Spring Boot's `Health` and exported on `HealthEndpoint` that works MVC (Spring Web MVC) if it is available.
Suppose a Spring Boot Web application did not specify `management.server.port`(SpringBoot1.x using `management.port`), you can access http://localhost:{port}/actuator/health (SpringBoot1.x visit http://localhost:{port}/health) via Web Client and will get a response with JSON format is like below :
Nacos Config Project:
```json
{
"status": "UP",
"details": {
"nacosConfig": {
"status": "UP"
},
"diskSpace": {
"status": "UP",
"details": {
"total": 250140434432,
"free": 52323512320,
"threshold": 10485760
}
}
}
}
```
Nacos Discovery Project:
```json
{
"status": "UP",
"details": {
"nacosDiscovery": {
"status": "UP"
},
"diskSpace": {
"status": "UP",
"details": {
"total": 250140434432,
"free": 52323680256,
"threshold": 10485760
}
}
}
}
```
For more information about Nacos Spring, see [Nacos Spring Project](https://github.com/nacos-group/nacos-spring-project). For more information about Nacos Spring, see [Nacos Spring Project](https://github.com/nacos-group/nacos-spring-project).
For more information about user guide, see [User Guide](https://github.com/nacos-group/nacos-spring-boot-project/wiki/%E7%94%A8%E6%88%B7%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3).
## Relative Projects ## Relative Projects
* [Alibaba Nacos](https://github.com/alibaba/nacos) * [Alibaba Nacos](https://github.com/alibaba/nacos)

View File

@ -1,296 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="12">
<profile kind="CodeFormatterProfile" name="Spring Boot Java Conventions" version="12">
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="8"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="90"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.compiler.source" value="1.8"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.8"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.8"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="tab"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="90"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
</profile>
</profiles>

View File

@ -1,412 +0,0 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.codeComplete.argumentPrefixes=
org.eclipse.jdt.core.codeComplete.argumentSuffixes=
org.eclipse.jdt.core.codeComplete.fieldPrefixes=
org.eclipse.jdt.core.codeComplete.fieldSuffixes=
org.eclipse.jdt.core.codeComplete.localPrefixes=
org.eclipse.jdt.core.codeComplete.localSuffixes=
org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.doc.comment.support=enabled
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
org.eclipse.jdt.core.compiler.problem.deadCode=warning
org.eclipse.jdt.core.compiler.problem.deprecation=warning
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=default
org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=default
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
org.eclipse.jdt.core.compiler.problem.nullReference=ignore
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
org.eclipse.jdt.core.compiler.problem.unusedImport=warning
org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.processAnnotations=disabled
org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=16
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
org.eclipse.jdt.core.formatter.blank_lines_before_field=0
org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
org.eclipse.jdt.core.formatter.blank_lines_before_method=1
org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
org.eclipse.jdt.core.formatter.blank_lines_before_package=0
org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false
org.eclipse.jdt.core.formatter.comment.format_block_comments=true
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
org.eclipse.jdt.core.formatter.comment.format_line_comments=true
org.eclipse.jdt.core.formatter.comment.format_source_code=false
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=do not insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
org.eclipse.jdt.core.formatter.comment.line_length=90
org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
org.eclipse.jdt.core.formatter.compact_else_if=true
org.eclipse.jdt.core.formatter.continuation_indentation=2
org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.join_lines_in_comments=true
org.eclipse.jdt.core.formatter.join_wrapped_lines=true
org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.jdt.core.formatter.lineSplit=90
org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=true
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter

File diff suppressed because one or more lines are too long

View File

@ -18,7 +18,7 @@
<parent> <parent>
<artifactId>nacos-spring-boot-parent</artifactId> <artifactId>nacos-spring-boot-parent</artifactId>
<groupId>com.alibaba.boot</groupId> <groupId>com.alibaba.boot</groupId>
<version>${revision}</version> <version>0.1.2</version>
<relativePath>../nacos-spring-boot-parent/pom.xml</relativePath> <relativePath>../nacos-spring-boot-parent/pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -81,20 +81,8 @@
<groupId>com.alibaba.nacos</groupId> <groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId> <artifactId>nacos-spring-context</artifactId>
<optional>true</optional> <optional>true</optional>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
</dependency>
<!-- Test Dependencies --> <!-- Test Dependencies -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

View File

@ -16,13 +16,16 @@
*/ */
package com.alibaba.boot.nacos.actuate.autoconfigure; package com.alibaba.boot.nacos.actuate.autoconfigure;
import com.alibaba.boot.nacos.actuate.endpoint.NacosConfigEndpoint; import org.springframework.boot.actuate.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import com.alibaba.boot.nacos.actuate.endpoint.NacosConfigEndpoint;
import com.alibaba.boot.nacos.config.NacosConfigConstants;
/** /**
* Nacos Config {@link Endpoint} Auto-{@link Configuration} * Nacos Config {@link Endpoint} Auto-{@link Configuration}
* *
@ -30,11 +33,12 @@ import org.springframework.context.annotation.Configuration;
* @see Endpoint * @see Endpoint
*/ */
@Configuration @Configuration
@ConditionalOnClass(Endpoint.class)
public class NacosConfigEndpointAutoConfiguration { public class NacosConfigEndpointAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
@ConditionalOnAvailableEndpoint @ConditionalOnEnabledEndpoint(NacosConfigConstants.ENDPOINT_PREFIX)
public NacosConfigEndpoint nacosEndpoint() { public NacosConfigEndpoint nacosEndpoint() {
return new NacosConfigEndpoint(); return new NacosConfigEndpoint();
} }

View File

@ -16,12 +16,8 @@
*/ */
package com.alibaba.boot.nacos.actuate.autoconfigure; package com.alibaba.boot.nacos.actuate.autoconfigure;
import com.alibaba.boot.nacos.actuate.health.NacosConfigHealthIndicator; import org.springframework.boot.actuate.autoconfigure.ConditionalOnEnabledHealthIndicator;
import com.alibaba.boot.nacos.config.NacosConfigConstants; import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator;
import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.AutoConfigureBefore;
@ -30,6 +26,10 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import com.alibaba.boot.nacos.actuate.health.NacosConfigHealthIndicator;
import com.alibaba.boot.nacos.config.NacosConfigConstants;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
/** /**
* Nacos {@link NacosConfigHealthIndicator} Auto Configuration * Nacos {@link NacosConfigHealthIndicator} Auto Configuration
* *

View File

@ -16,33 +16,31 @@
*/ */
package com.alibaba.boot.nacos.actuate.endpoint; package com.alibaba.boot.nacos.actuate.endpoint;
import static com.alibaba.nacos.spring.util.NacosBeanUtils.CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import com.alibaba.boot.nacos.common.PropertiesUtils;
import com.alibaba.boot.nacos.config.NacosConfigConstants;
import com.alibaba.nacos.api.config.annotation.NacosConfigListener;
import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.alibaba.nacos.spring.context.event.config.NacosConfigMetadataEvent;
import com.alibaba.nacos.spring.util.NacosUtils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.commons.lang3.ClassUtils; import org.apache.commons.lang3.ClassUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.w3c.dom.Element;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.actuate.endpoint.AbstractEndpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.AnnotationMetadata;
import org.w3c.dom.Element;
import static com.alibaba.nacos.spring.util.NacosBeanUtils.CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME; import com.alibaba.boot.nacos.common.PropertiesUtils;
import com.alibaba.boot.nacos.config.NacosConfigConstants;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.config.annotation.NacosConfigListener;
import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties;
import com.alibaba.nacos.spring.context.event.config.NacosConfigMetadataEvent;
import com.alibaba.nacos.spring.util.NacosUtils;
/** /**
* Actuator {@link Endpoint} to expose Nacos Config Meta Data * Actuator {@link Endpoint} to expose Nacos Config Meta Data
@ -50,18 +48,21 @@ import static com.alibaba.nacos.spring.util.NacosBeanUtils.CONFIG_GLOBAL_NACOS_P
* @author <a href="mailto:fangjian0423@gmail.com">Jim</a> * @author <a href="mailto:fangjian0423@gmail.com">Jim</a>
* @see Endpoint * @see Endpoint
*/ */
@Endpoint(id = NacosConfigConstants.ENDPOINT_PREFIX) public class NacosConfigEndpoint extends AbstractEndpoint<Map<String, Object>>
public class NacosConfigEndpoint
implements ApplicationListener<NacosConfigMetadataEvent> { implements ApplicationListener<NacosConfigMetadataEvent> {
@Autowired @Autowired
private ApplicationContext applicationContext; private ApplicationContext applicationContext;
private Map<String, JsonNode> nacosConfigMetadataMap = new HashMap<>(8); private Map<String, JSONObject> nacosConfigMetadataMap = new HashMap<>();
@ReadOperation public NacosConfigEndpoint() {
super(NacosConfigConstants.ENDPOINT_PREFIX);
}
@Override
public Map<String, Object> invoke() { public Map<String, Object> invoke() {
Map<String, Object> result = new HashMap<>(8); Map<String, Object> result = new HashMap<>();
if (!(ClassUtils.isAssignable(applicationContext.getEnvironment().getClass(), if (!(ClassUtils.isAssignable(applicationContext.getEnvironment().getClass(),
ConfigurableEnvironment.class))) { ConfigurableEnvironment.class))) {
@ -84,37 +85,37 @@ public class NacosConfigEndpoint
public void onApplicationEvent(NacosConfigMetadataEvent event) { public void onApplicationEvent(NacosConfigMetadataEvent event) {
String key = buildMetadataKey(event); String key = buildMetadataKey(event);
if (StringUtils.isNotEmpty(key) && !nacosConfigMetadataMap.containsKey(key)) { if (StringUtils.isNotEmpty(key) && !nacosConfigMetadataMap.containsKey(key)) {
ObjectNode jsonNode = JacksonUtils.createEmptyJsonNode(); JSONObject jsonObject = new JSONObject();
jsonNode.put("groupId", event.getGroupId()); jsonObject.put("groupId", event.getGroupId());
jsonNode.put("dataId", event.getDataId()); jsonObject.put("dataId", event.getDataId());
if (ClassUtils.isAssignable(event.getSource().getClass(), if (ClassUtils.isAssignable(event.getSource().getClass(),
AnnotationMetadata.class)) { AnnotationMetadata.class)) {
jsonNode.put("origin", "NacosPropertySource"); jsonObject.put("origin", "NacosPropertySource");
jsonNode.put("target", jsonObject.put("target",
((AnnotationMetadata) event.getSource()).getClassName()); ((AnnotationMetadata) event.getSource()).getClassName());
} }
else if (ClassUtils.isAssignable(event.getSource().getClass(), else if (ClassUtils.isAssignable(event.getSource().getClass(),
NacosConfigListener.class)) { NacosConfigListener.class)) {
jsonNode.put("origin", "NacosConfigListener"); jsonObject.put("origin", "NacosConfigListener");
Method configListenerMethod = (Method) event.getAnnotatedElement(); Method configListenerMethod = (Method) event.getAnnotatedElement();
jsonNode.put("target", jsonObject.put("target",
configListenerMethod.getDeclaringClass().getName() + ":" configListenerMethod.getDeclaringClass().getName() + ":"
+ configListenerMethod.toString()); + configListenerMethod.toString());
} }
else if (ClassUtils.isAssignable(event.getSource().getClass(), else if (ClassUtils.isAssignable(event.getSource().getClass(),
NacosConfigurationProperties.class)) { NacosConfigurationProperties.class)) {
jsonNode.put("origin", "NacosConfigurationProperties"); jsonObject.put("origin", "NacosConfigurationProperties");
jsonNode.put("target", event.getBeanType().getName()); jsonObject.put("target", event.getBeanType().getName());
} }
else if (ClassUtils.isAssignable(event.getSource().getClass(), else if (ClassUtils.isAssignable(event.getSource().getClass(),
Element.class)) { Element.class)) {
jsonNode.put("origin", "NacosPropertySource"); jsonObject.put("origin", "NacosPropertySource");
jsonNode.put("target", event.getXmlResource().toString()); jsonObject.put("target", event.getXmlResource().toString());
} }
else { else {
throw new RuntimeException("unknown NacosConfigMetadataEvent"); throw new RuntimeException("unknown NacosConfigMetadataEvent");
} }
nacosConfigMetadataMap.put(key, jsonNode); nacosConfigMetadataMap.put(key, jsonObject);
} }
} }

View File

@ -18,19 +18,19 @@ package com.alibaba.boot.nacos.actuate.health;
import java.util.Properties; import java.util.Properties;
import com.alibaba.boot.nacos.common.PropertiesUtils;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.alibaba.nacos.spring.factory.CacheableEventPublishingNacosServiceFactory;
import com.alibaba.nacos.spring.factory.NacosServiceFactory;
import com.alibaba.nacos.spring.metadata.NacosServiceMetaData;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import com.alibaba.boot.nacos.common.PropertiesUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.spring.factory.CacheableEventPublishingNacosServiceFactory;
import com.alibaba.nacos.spring.factory.NacosServiceFactory;
import com.alibaba.nacos.spring.metadata.NacosServiceMetaData;
/** /**
* Nacos Config {@link HealthIndicator} * Nacos Config {@link HealthIndicator}
* *
@ -38,7 +38,6 @@ import org.springframework.context.ApplicationContext;
* @see HealthIndicator * @see HealthIndicator
*/ */
public class NacosConfigHealthIndicator extends AbstractHealthIndicator { public class NacosConfigHealthIndicator extends AbstractHealthIndicator {
@Autowired @Autowired
private ApplicationContext applicationContext; private ApplicationContext applicationContext;
@ -47,14 +46,13 @@ public class NacosConfigHealthIndicator extends AbstractHealthIndicator {
@Override @Override
protected void doHealthCheck(Health.Builder builder) throws Exception { protected void doHealthCheck(Health.Builder builder) throws Exception {
builder.up(); builder.up();
NacosServiceFactory nacosServiceFactory = CacheableEventPublishingNacosServiceFactory NacosServiceFactory nacosServiceFactory = CacheableEventPublishingNacosServiceFactory.getSingleton();
.getSingleton();
for (ConfigService configService : nacosServiceFactory.getConfigServices()) { for (ConfigService configService : nacosServiceFactory.getConfigServices()) {
if (configService instanceof NacosServiceMetaData) { if (configService instanceof NacosServiceMetaData) {
NacosServiceMetaData nacosServiceMetaData = (NacosServiceMetaData) configService; NacosServiceMetaData nacosServiceMetaData = (NacosServiceMetaData) configService;
Properties properties = nacosServiceMetaData.getProperties(); Properties properties = nacosServiceMetaData.getProperties();
builder.withDetail( builder.withDetail(
JacksonUtils.toJson( JSON.toJSONString(
PropertiesUtils.extractSafeProperties(properties)), PropertiesUtils.extractSafeProperties(properties)),
configService.getServerStatus()); configService.getServerStatus());
} }

View File

@ -1,56 +0,0 @@
[
{
"name": "org.springframework.core.env.ConfigurableEnvironment",
"allDeclaredMethods": true,
"allDeclaredFields": true,
"allDeclaredConstructors": true,
"allPublicMethods": true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name": "java.util.Properties",
"allDeclaredMethods": true,
"allDeclaredFields": true,
"allDeclaredConstructors": true,
"allPublicMethods": true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name": "org.springframework.core.type.AnnotationMetadata",
"allDeclaredMethods": true,
"allDeclaredFields": true,
"allDeclaredConstructors": true,
"allPublicMethods": true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name": "com.alibaba.nacos.api.config.annotation.NacosConfigListener",
"allDeclaredMethods": true,
"allDeclaredFields": true,
"allDeclaredConstructors": true,
"allPublicMethods": true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name": "com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties",
"allDeclaredMethods": true,
"allDeclaredFields": true,
"allDeclaredConstructors": true,
"allPublicMethods": true,
"allPublicFields": true,
"allPublicConstructors": true
},
{
"name": "org.w3c.dom.Element",
"allDeclaredMethods": true,
"allDeclaredFields": true,
"allDeclaredConstructors": true,
"allPublicMethods": true,
"allPublicFields": true,
"allPublicConstructors": true
}
]

View File

@ -1,2 +0,0 @@
com.alibaba.boot.nacos.actuate.autoconfigure.NacosConfigEndpointAutoConfiguration
com.alibaba.boot.nacos.actuate.autoconfigure.NacosConfigHealthIndicatorAutoConfiguration

View File

@ -1,51 +0,0 @@
/*
*
* * Licensed to the Apache Software Foundation (ASF) under one or more
* * contributor license agreements. See the NOTICE file distributed with
* * this work for additional information regarding copyright ownership.
* * The ASF licenses this file to You under the Apache License, Version 2.0
* * (the "License"); you may not use this file except in compliance with
* * the License. You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package com.alibaba.boot.nacos.actuate.autoconfigure;
import com.alibaba.boot.nacos.actuate.endpoint.NacosConfigEndpoint;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* {@link NacosConfigEndpointAutoConfiguration} Test
* @ClassName: NacosConfigEndpointAutoConfigurationTest
* @Author: SuperZ1999
* @Date: 2023/9/28
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {NacosConfigEndpointAutoConfiguration.class})
@TestPropertySource(properties = {
"management.endpoints.web.exposure.include=nacos-config"
})
public class NacosConfigEndpointAutoConfigurationTest {
@Autowired
private ApplicationContext context;
@Test
public void testNacosConfigEndpointBean() {
Assert.assertNotNull(context.getBean(NacosConfigEndpoint.class));
}
}

View File

@ -1,47 +0,0 @@
/*
*
* * Licensed to the Apache Software Foundation (ASF) under one or more
* * contributor license agreements. See the NOTICE file distributed with
* * this work for additional information regarding copyright ownership.
* * The ASF licenses this file to You under the Apache License, Version 2.0
* * (the "License"); you may not use this file except in compliance with
* * the License. You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package com.alibaba.boot.nacos.actuate.autoconfigure;
import com.alibaba.boot.nacos.actuate.health.NacosConfigHealthIndicator;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* {@link NacosConfigHealthIndicatorAutoConfiguration} Test
* @ClassName: NacosConfigHealthIndicatorAutoConfigurationTest
* @Author: SuperZ1999
* @Date: 2023/9/28
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {NacosConfigHealthIndicatorAutoConfiguration.class})
public class NacosConfigHealthIndicatorAutoConfigurationTest {
@Autowired
private ApplicationContext context;
@Test
public void testNacosConfigHealthIndicatorBean() {
Assert.assertNotNull(context.getBean(NacosConfigHealthIndicator.class));
}
}

View File

@ -18,15 +18,15 @@ package com.alibaba.boot.nacos.actuate.endpoint;
import java.util.Map; import java.util.Map;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
/** /**
* {@link NacosConfigEndpoint} Test * {@link NacosConfigEndpoint} Test
* *

View File

@ -18,7 +18,7 @@
<parent> <parent>
<groupId>com.alibaba.boot</groupId> <groupId>com.alibaba.boot</groupId>
<artifactId>nacos-spring-boot-parent</artifactId> <artifactId>nacos-spring-boot-parent</artifactId>
<version>${revision}</version> <version>0.1.2</version>
<relativePath>../nacos-spring-boot-parent</relativePath> <relativePath>../nacos-spring-boot-parent</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -27,18 +27,6 @@
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Nacos Config Spring Boot AutoConfigure</name> <name>Nacos Config Spring Boot AutoConfigure</name>
<description>Nacos Config Spring Boot AutoConfigure</description> <description>Nacos Config Spring Boot AutoConfigure</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies> <dependencies>
@ -66,30 +54,11 @@
<groupId>com.alibaba.nacos</groupId> <groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId> <artifactId>nacos-spring-context</artifactId>
<optional>true</optional> <optional>true</optional>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-spring-boot-base</artifactId>
<optional>true</optional>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.alibaba.boot</groupId> <groupId>com.alibaba.boot</groupId>
<artifactId>nacos-spring-boot-aot</artifactId> <artifactId>nacos-spring-boot-base</artifactId>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>

View File

@ -25,14 +25,12 @@ import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
*/ */
public interface NacosConfigConstants { public interface NacosConfigConstants {
String ENDPOINT_PREFIX = "nacos-config"; String ENDPOINT_PREFIX = "nacos_config";
String ENABLED = EnableNacosConfig.CONFIG_PREFIX + "enabled"; String ENABLED = EnableNacosConfig.CONFIG_PREFIX + "enabled";
String PREFIX = "nacos.config"; String PREFIX = "nacos.config";
String NACOS_BOOTSTRAP = PREFIX + ".bootstrap.enable"; String NACOS_BOOTSTRAP = PREFIX + ".bootstrap.enable";
String NACOS_LOG_BOOTSTRAP = PREFIX + ".bootstrap.log.enable";
} }

View File

@ -1,32 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.autoconfigure;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.3
*/
public class NacosBootConfigException extends RuntimeException {
public NacosBootConfigException(Throwable cause) {
super(cause);
}
public NacosBootConfigException(String message, Throwable cause) {
super(message, cause);
}
}

View File

@ -1,104 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.autoconfigure;
import java.util.Properties;
import java.util.function.Function;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.boot.nacos.config.util.NacosConfigLoader;
import com.alibaba.boot.nacos.config.util.NacosConfigLoaderFactory;
import com.alibaba.boot.nacos.config.util.NacosConfigPropertiesUtils;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.client.config.utils.SnapShotSwitch;
import com.alibaba.nacos.spring.factory.CacheableEventPublishingNacosServiceFactory;
import com.alibaba.nacos.spring.util.NacosBeanUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.2
*/
public class NacosConfigApplicationContextInitializer
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private final Logger logger = LoggerFactory
.getLogger(NacosConfigApplicationContextInitializer.class);
private final NacosConfigEnvironmentProcessor processor;
private final CacheableEventPublishingNacosServiceFactory singleton = CacheableEventPublishingNacosServiceFactory
.getSingleton();
private final Function<Properties, ConfigService> builder = properties -> {
try {
return singleton.createConfigService(properties);
}
catch (NacosException e) {
throw new NacosBootConfigException(
"ConfigService can't be created with properties : " + properties, e);
}
};
private ConfigurableEnvironment environment;
private NacosConfigProperties nacosConfigProperties;
public NacosConfigApplicationContextInitializer(
NacosConfigEnvironmentProcessor configEnvironmentProcessor) {
this.processor = configEnvironmentProcessor;
}
@Override
public void initialize(ConfigurableApplicationContext context) {
singleton.setApplicationContext(context);
environment = context.getEnvironment();
nacosConfigProperties = NacosConfigPropertiesUtils
.buildNacosConfigProperties(environment);
final NacosConfigLoader configLoader = NacosConfigLoaderFactory.getSingleton(builder);
if (!processor.snapshotEnable()){
SnapShotSwitch.setIsSnapShot(false);
}
if (!enable()) {
logger.info("[Nacos Config Boot] : The preload configuration is not enabled");
}
else {
// If it opens the log level loading directly will cache
// DeferNacosPropertySource release
if (processor.enable()) {
processor.publishDeferService(context);
configLoader
.addListenerIfAutoRefreshed(processor.getDeferPropertySources());
}
else {
configLoader.loadConfig(environment, nacosConfigProperties);
configLoader.addListenerIfAutoRefreshed();
}
}
}
private boolean enable() {
return processor.enable() || nacosConfigProperties.getBootstrap().isEnable();
}
}

View File

@ -0,0 +1,122 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.autoconfigure;
import com.alibaba.boot.nacos.config.NacosConfigConstants;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.boot.nacos.config.util.NacosConfigPropertiesUtils;
import com.alibaba.boot.nacos.config.util.NacosPropertiesBuilder;
import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.spring.core.env.NacosPropertySource;
import com.alibaba.nacos.spring.core.env.NacosPropertySourcePostProcessor;
import com.alibaba.nacos.spring.factory.CacheableEventPublishingNacosServiceFactory;
import com.alibaba.nacos.spring.util.NacosBeanUtils;
import com.alibaba.nacos.spring.util.config.NacosConfigLoader;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import java.util.Properties;
import static com.alibaba.nacos.spring.util.NacosUtils.buildDefaultPropertySourceName;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since
*/
public class NacosConfigApplicationInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private final Logger logger = LoggerFactory.getLogger(NacosConfigApplicationInitializer.class);
private ConfigurableEnvironment environment;
private NacosConfigProperties nacosConfigProperties;
private NacosConfigLoader nacosConfigLoader;
@Override
public void initialize(ConfigurableApplicationContext context) {
CacheableEventPublishingNacosServiceFactory singleton = CacheableEventPublishingNacosServiceFactory.getSingleton();
singleton.setApplicationContext(context);
environment = context.getEnvironment();
nacosConfigLoader = new NacosConfigLoader(environment);
nacosConfigLoader.setNacosServiceFactory(singleton);
if (!isEnable()) {
logger.info("[Nacos Config Boot] : The preload configuration is not enabled");
} else {
logger.info("[Nacos Config Boot] : The preload configuration is enabled");
nacosConfigProperties = NacosConfigPropertiesUtils.buildNacosConfigProperties(environment);
Properties globalProperties = buildGlobalNacosProperties();
MutablePropertySources mutablePropertySources = environment.getPropertySources();
mutablePropertySources.addLast(reqGlobalNacosConfig(globalProperties, nacosConfigProperties.getType()));
for (NacosConfigProperties.Config config : nacosConfigProperties.getExtConfig()) {
mutablePropertySources.addLast(reqSubNacosConfig(config, globalProperties, config.getType()));
}
}
}
private boolean isEnable() {
return Boolean.valueOf(environment.getProperty(NacosConfigConstants.NACOS_BOOTSTRAP, "false"));
}
private Properties buildGlobalNacosProperties() {
return NacosPropertiesBuilder.buildNacosProperties(nacosConfigProperties.getServerAddr(), nacosConfigProperties.getNamespace(),
nacosConfigProperties.getEndpoint(), nacosConfigProperties.getSecretKey(), nacosConfigProperties.getAccessKey(),
nacosConfigProperties.getConfigLongPollTimeout(), nacosConfigProperties.getConfigRetryTime(),
nacosConfigProperties.getMaxRetry(), nacosConfigProperties.isEnableRemoteSyncConfig());
}
private Properties buildSubNacosProperties(Properties globalProperties, NacosConfigProperties.Config config) {
if (StringUtils.isEmpty(config.getServerAddr())) {
return globalProperties;
}
Properties sub = NacosPropertiesBuilder.buildNacosProperties(config.getServerAddr(), config.getNamespace(),
config.getEndpoint(), config.getSecretKey(), config.getAccessKey(), config.getConfigLongPollTimeout(),
config.getConfigRetryTime(), config.getMaxRetry(), config.isEnableRemoteSyncConfig());
NacosPropertiesBuilder.merge(sub, globalProperties);
return sub;
}
private NacosPropertySource reqGlobalNacosConfig(Properties globalProperties, ConfigType type) {
NacosPropertySource propertySource = reqNacosConfig(globalProperties, nacosConfigProperties.getDataId(), nacosConfigProperties.getGroup(), type);
propertySource.setAutoRefreshed(nacosConfigProperties.isAutoRefresh());
NacosPropertySourcePostProcessor.addListenerIfAutoRefreshed(propertySource, globalProperties, environment);
return propertySource;
}
private NacosPropertySource reqSubNacosConfig(NacosConfigProperties.Config config, Properties globalProperties, ConfigType type) {
Properties subConfigProperties = buildSubNacosProperties(globalProperties, config);
NacosPropertySource nacosPropertySource = reqNacosConfig(subConfigProperties, config.getDataId(), config.getGroup(), type);
nacosPropertySource.setAutoRefreshed(config.isAutoRefresh());
NacosPropertySourcePostProcessor.addListenerIfAutoRefreshed(nacosPropertySource, subConfigProperties, environment);
return nacosPropertySource;
}
private NacosPropertySource reqNacosConfig(Properties configProperties, String dataId, String groupId, ConfigType type) {
NacosPropertySource nacosPropertySource;
String config = nacosConfigLoader.load(dataId, groupId, configProperties);
nacosPropertySource = new NacosPropertySource(dataId, groupId, buildDefaultPropertySourceName(dataId, groupId, configProperties), config, type.getType());
nacosPropertySource.setDataId(dataId);
nacosPropertySource.setType(type.getType());
nacosPropertySource.setGroupId(groupId);
return nacosPropertySource;
}
}

View File

@ -16,19 +16,19 @@
*/ */
package com.alibaba.boot.nacos.config.autoconfigure; package com.alibaba.boot.nacos.config.autoconfigure;
import com.alibaba.boot.nacos.aot.context.EnableNacosConfigAotProcessor; import static com.alibaba.nacos.spring.util.NacosBeanUtils.CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME;
import com.alibaba.boot.nacos.config.NacosConfigConstants;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import static com.alibaba.nacos.spring.util.NacosBeanUtils.CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME; import com.alibaba.boot.nacos.config.NacosConfigConstants;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import org.springframework.context.annotation.Import;
/** /**
* Nacos Config Auto {@link Configuration} * Nacos Config Auto {@link Configuration}
@ -37,10 +37,10 @@ import static com.alibaba.nacos.spring.util.NacosBeanUtils.CONFIG_GLOBAL_NACOS_P
*/ */
@ConditionalOnProperty(name = NacosConfigConstants.ENABLED, matchIfMissing = true) @ConditionalOnProperty(name = NacosConfigConstants.ENABLED, matchIfMissing = true)
@ConditionalOnMissingBean(name = CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME) @ConditionalOnMissingBean(name = CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME)
@EnableConfigurationProperties(value = NacosConfigProperties.class)
@ConditionalOnClass(name = "org.springframework.boot.context.properties.bind.Binder")
@Import(value = { NacosConfigBootBeanDefinitionRegistrar.class, EnableNacosConfigAotProcessor.class })
@EnableNacosConfig @EnableNacosConfig
@EnableConfigurationProperties(value = NacosConfigProperties.class)
@ConditionalOnClass(name = "org.springframework.boot.bind.RelaxedDataBinder")
@Import(value = {NacosConfigBootBeanDefinitionRegistrar.class})
public class NacosConfigAutoConfiguration { public class NacosConfigAutoConfiguration {
} }

View File

@ -30,25 +30,22 @@ import org.springframework.core.type.AnnotationMetadata;
/** /**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a> * @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.2 * @since
*/ */
@Configuration @Configuration
public class NacosConfigBootBeanDefinitionRegistrar public class NacosConfigBootBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {
implements ImportBeanDefinitionRegistrar, BeanFactoryAware {
@Override @Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException { public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory; DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder
.rootBeanDefinition(NacosBootConfigurationPropertiesBinder.class); .rootBeanDefinition(NacosBootConfigurationPropertiesBinder.class);
defaultListableBeanFactory.registerBeanDefinition( defaultListableBeanFactory.registerBeanDefinition(NacosBootConfigurationPropertiesBinder.BEAN_NAME, beanDefinitionBuilder.getBeanDefinition());
NacosBootConfigurationPropertiesBinder.BEAN_NAME, }
beanDefinitionBuilder.getBeanDefinition());
}
@Override @Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinitionRegistry registry) {
}
}
}
}

View File

@ -1,132 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.autoconfigure;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Properties;
import java.util.function.Function;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.boot.nacos.config.util.NacosConfigLoader;
import com.alibaba.boot.nacos.config.util.NacosConfigLoaderFactory;
import com.alibaba.boot.nacos.config.util.NacosConfigPropertiesUtils;
import com.alibaba.boot.nacos.config.util.log.LogAutoFreshProcess;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.spring.factory.CacheableEventPublishingNacosServiceFactory;
import com.alibaba.nacos.spring.util.NacosUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.core.Ordered;
import org.springframework.core.env.ConfigurableEnvironment;
/**
* In the Context to create premise before loading the log configuration information
*
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.3
*/
public class NacosConfigEnvironmentProcessor
implements EnvironmentPostProcessor, Ordered {
private final Logger logger = LoggerFactory
.getLogger(NacosConfigEnvironmentProcessor.class);
private final CacheableEventPublishingNacosServiceFactory nacosServiceFactory = CacheableEventPublishingNacosServiceFactory
.getSingleton();
private final Map<String, ConfigService> serviceCache = new HashMap<>(8);
private final LinkedList<NacosConfigLoader.DeferNacosPropertySource> deferPropertySources = new LinkedList<>();
private NacosConfigProperties nacosConfigProperties;
// Because ApplicationContext has not been injected at preload time, need to manually
// cache the created Service to prevent duplicate creation
private final Function<Properties, ConfigService> builder = properties -> {
try {
final String key = NacosUtils.identify(properties);
if (serviceCache.containsKey(key)) {
return serviceCache.get(key);
}
final ConfigService configService = NacosFactory
.createConfigService(properties);
serviceCache.put(key, configService);
return nacosServiceFactory.deferCreateService(configService, properties);
}
catch (NacosException e) {
throw new NacosBootConfigException(
"ConfigService can't be created with properties : " + properties, e);
}
};
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment,
SpringApplication application) {
application.addInitializers(new NacosConfigApplicationContextInitializer(this));
nacosConfigProperties = NacosConfigPropertiesUtils
.buildNacosConfigProperties(environment);
if (enable()) {
System.out.println(
"[Nacos Config Boot] : The preload log configuration is enabled");
NacosConfigLoader nacosConfigLoader = NacosConfigLoaderFactory.getSingleton(builder);
loadConfig(nacosConfigLoader, environment, nacosConfigProperties);
LogAutoFreshProcess.build(environment, nacosConfigProperties, nacosConfigLoader, builder).process();
}
}
private void loadConfig(NacosConfigLoader configLoader, ConfigurableEnvironment environment, NacosConfigProperties nacosConfigProperties) {
configLoader.loadConfig(environment, nacosConfigProperties);
// set defer NacosPropertySource
deferPropertySources.addAll(configLoader.getNacosPropertySources());
}
boolean enable() {
return nacosConfigProperties != null
&& nacosConfigProperties.getBootstrap().isLogEnable();
}
boolean snapshotEnable() {
return nacosConfigProperties != null
&& nacosConfigProperties.getBootstrap().isSnapshotEnable();
}
LinkedList<NacosConfigLoader.DeferNacosPropertySource> getDeferPropertySources() {
return deferPropertySources;
}
// Do not set the minimum priority for future expansion needs
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE - 5;
}
void publishDeferService(ApplicationContext context) {
try {
nacosServiceFactory.publishDeferService(context);
serviceCache.clear();
}
catch (Exception e) {
logger.error("publish defer ConfigService has some error", e);
}
}
}

View File

@ -16,74 +16,44 @@
*/ */
package com.alibaba.boot.nacos.config.binder; package com.alibaba.boot.nacos.config.binder;
import java.lang.reflect.Method;
import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties; import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties;
import com.alibaba.nacos.spring.context.properties.config.NacosConfigurationPropertiesBinder; import com.alibaba.nacos.spring.context.properties.config.NacosConfigurationPropertiesBinder;
import com.alibaba.nacos.spring.core.env.NacosPropertySource; import org.slf4j.Logger;
import com.alibaba.nacos.spring.util.ObjectUtils; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.bind.RelaxedDataBinder;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.ResolvableType;
import org.springframework.core.env.StandardEnvironment; import java.util.Properties;
import static com.alibaba.nacos.spring.util.NacosUtils.toProperties;
/** /**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a> * @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.2 * @since
*/ */
public class NacosBootConfigurationPropertiesBinder public class NacosBootConfigurationPropertiesBinder extends NacosConfigurationPropertiesBinder {
extends NacosConfigurationPropertiesBinder {
private final ConfigurableApplicationContext applicationContext; private final Logger logger = LoggerFactory.getLogger(NacosBootConfigurationPropertiesBinder.class);
private final StandardEnvironment environment = new StandardEnvironment(); private ConfigurableApplicationContext context;
public NacosBootConfigurationPropertiesBinder( public NacosBootConfigurationPropertiesBinder(ConfigurableApplicationContext applicationContext) {
ConfigurableApplicationContext applicationContext) { super(applicationContext);
super(applicationContext); this.context = applicationContext;
this.applicationContext = applicationContext; }
}
@Override @Override
protected void doBind(Object bean, String beanName, String dataId, String groupId, protected void doBind(Object bean, String beanName, String dataId, String groupId,
String configType, NacosConfigurationProperties properties, String content, NacosConfigurationProperties properties, String content, ConfigService configService) {
ConfigService configService) { String configType = properties.yaml() ? ConfigType.YAML.getType() : properties.type().getType();
synchronized (this) { Properties prop = toProperties(dataId, groupId, content, configType);
String name = "nacos-bootstrap-" + beanName; RelaxedDataBinder binder = new RelaxedDataBinder(bean, properties.prefix());
NacosPropertySource propertySource = new NacosPropertySource(dataId, groupId, name, content, configType); binder.bind(new MutablePropertyValues(prop));
environment.getPropertySources().addLast(propertySource); publishBoundEvent(bean, beanName, dataId, groupId, properties, content, configService);
ObjectUtils.cleanMapOrCollectionField(bean); publishMetadataEvent(bean, beanName, dataId, groupId, properties);
Binder binder = Binder.get(environment); }
ResolvableType type = getBeanType(bean, beanName);
Bindable<?> target = Bindable.of(type).withExistingValue(bean);
binder.bind(properties.prefix(), target);
publishBoundEvent(bean, beanName, dataId, groupId, properties, content, configService);
publishMetadataEvent(bean, beanName, dataId, groupId, properties);
environment.getPropertySources().remove(name);
}
}
private ResolvableType getBeanType(Object bean, String beanName) {
Method factoryMethod = findFactoryMethod(beanName);
if (factoryMethod != null) {
return ResolvableType.forMethodReturnType(factoryMethod);
}
return ResolvableType.forClass(bean.getClass());
}
public Method findFactoryMethod(String beanName) {
ConfigurableListableBeanFactory beanFactory = this.applicationContext.getBeanFactory();
if (beanFactory.containsBeanDefinition(beanName)) {
BeanDefinition beanDefinition = beanFactory.getMergedBeanDefinition(beanName);
if (beanDefinition instanceof RootBeanDefinition) {
return ((RootBeanDefinition) beanDefinition).getResolvedFactoryMethod();
}
}
return null;
}
} }

View File

@ -1,67 +0,0 @@
/*
* Copyright 2013-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.logging;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.boot.nacos.config.util.NacosConfigPropertiesUtils;
import com.alibaba.nacos.client.logging.NacosLogging;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.GenericApplicationListener;
import org.springframework.core.Ordered;
import org.springframework.core.ResolvableType;
/**
* Reload nacos log configuration file, after
* {@link org.springframework.boot.context.logging.LoggingApplicationListener}.
*
* @author mai.jh
*/
public class NacosLoggingListener implements GenericApplicationListener {
@Override
public boolean supportsEventType(ResolvableType resolvableType) {
Class<?> type = resolvableType.getRawClass();
if (type != null) {
return ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(type);
}
return false;
}
@Override
public boolean supportsSourceType(Class<?> aClass) {
return true;
}
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
//If the managed log is enabled, load your own log configuration after loading the user log configuration
ApplicationEnvironmentPreparedEvent applicationEnvironmentPreparedEvent = (ApplicationEnvironmentPreparedEvent) applicationEvent;
NacosConfigProperties nacosConfigProperties = NacosConfigPropertiesUtils.buildNacosConfigProperties(
applicationEnvironmentPreparedEvent.getEnvironment());
if(nacosConfigProperties.getBootstrap().isLogEnable()){
NacosLogging.getInstance().loadConfiguration();
}
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE + 21;
}
}

View File

@ -16,19 +16,16 @@
package com.alibaba.boot.nacos.config.properties; package com.alibaba.boot.nacos.config.properties;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import com.alibaba.boot.nacos.config.NacosConfigConstants; import com.alibaba.boot.nacos.config.NacosConfigConstants;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.nacos.api.common.Constants; import com.alibaba.nacos.api.common.Constants;
import com.alibaba.nacos.api.config.ConfigType; import com.alibaba.nacos.api.config.ConfigType;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.List;
/** /**
* {@link ConfigurationProperties} for configuring Nacos Config. * {@link ConfigurationProperties} for configuring Nacos Config.
* *
@ -37,491 +34,298 @@ import org.springframework.util.Assert;
@ConfigurationProperties(NacosConfigConstants.PREFIX) @ConfigurationProperties(NacosConfigConstants.PREFIX)
public class NacosConfigProperties { public class NacosConfigProperties {
private String serverAddr = "127.0.0.1:8848"; private String serverAddr;
private String contextPath; private String contextPath;
private String encode; private String encode;
private String endpoint; private String endpoint;
private String namespace; private String namespace;
private String accessKey; private String accessKey;
private String secretKey; private String secretKey;
private String ramRoleName; private boolean autoRefresh = false;
private boolean autoRefresh = false; private String dataId;
private String dataId; private String group = Constants.DEFAULT_GROUP;
private String dataIds; private ConfigType type;
private String group = Constants.DEFAULT_GROUP; private String maxRetry;
private ConfigType type = ConfigType.PROPERTIES; private String configLongPollTimeout;
private String maxRetry; private String configRetryTime;
private String configLongPollTimeout; private boolean enableRemoteSyncConfig = false;
private String configRetryTime; @JSONField(serialize = false)
private List<Config> extConfig = new ArrayList<>();
private boolean enableRemoteSyncConfig = false; public String getServerAddr() {
return serverAddr;
}
private String username; public void setServerAddr(String serverAddr) {
Assert.notNull(serverAddr, "nacos config server-addr must not be null");
this.serverAddr = serverAddr;
}
private String password; public String getContextPath() {
return contextPath;
}
private boolean remoteFirst = false; public void setContextPath(String contextPath) {
this.contextPath = contextPath;
}
@JsonIgnore public String getEncode() {
private List<Config> extConfig = new ArrayList<>(); return encode;
}
@NestedConfigurationProperty public void setEncode(String encode) {
private Bootstrap bootstrap = new Bootstrap(); this.encode = encode;
}
public String getUsername() { public String getEndpoint() {
return username; return endpoint;
} }
public void setUsername(String username) { public void setEndpoint(String endpoint) {
this.username = username; this.endpoint = endpoint;
} }
public String getPassword() { public String getNamespace() {
return password; return namespace;
} }
public void setPassword(String password) { public void setNamespace(String namespace) {
this.password = password; this.namespace = namespace;
} }
public String getServerAddr() { public String getAccessKey() {
return serverAddr; return accessKey;
} }
public void setServerAddr(String serverAddr) { public void setAccessKey(String accessKey) {
Assert.notNull(serverAddr, "nacos config server-addr must not be null"); this.accessKey = accessKey;
this.serverAddr = serverAddr; }
}
public String getContextPath() { public String getSecretKey() {
return contextPath; return secretKey;
} }
public void setContextPath(String contextPath) { public void setSecretKey(String secretKey) {
this.contextPath = contextPath; this.secretKey = secretKey;
} }
public String getEncode() { public boolean isAutoRefresh() {
return encode; return autoRefresh;
} }
public void setEncode(String encode) { public void setAutoRefresh(boolean autoRefresh) {
this.encode = encode; this.autoRefresh = autoRefresh;
} }
public String getEndpoint() { public String getDataId() {
return endpoint; return dataId;
} }
public void setEndpoint(String endpoint) { public void setDataId(String dataId) {
this.endpoint = endpoint; this.dataId = dataId;
} }
public String getNamespace() { public String getGroup() {
return namespace; return group;
} }
public void setNamespace(String namespace) { public void setGroup(String group) {
this.namespace = namespace; this.group = group;
} }
public String getAccessKey() { public ConfigType getType() {
return accessKey; return type;
} }
public void setAccessKey(String accessKey) { public void setType(ConfigType type) {
this.accessKey = accessKey; this.type = type;
} }
public String getSecretKey() { public String getMaxRetry() {
return secretKey; return maxRetry;
} }
public void setSecretKey(String secretKey) { public void setMaxRetry(String maxRetry) {
this.secretKey = secretKey; this.maxRetry = maxRetry;
} }
public String getRamRoleName() { public String getConfigLongPollTimeout() {
return ramRoleName; return configLongPollTimeout;
} }
public void setRamRoleName(String ramRoleName) { public void setConfigLongPollTimeout(String configLongPollTimeout) {
this.ramRoleName = ramRoleName; this.configLongPollTimeout = configLongPollTimeout;
} }
public boolean isAutoRefresh() { public String getConfigRetryTime() {
return autoRefresh; return configRetryTime;
} }
public void setAutoRefresh(boolean autoRefresh) { public void setConfigRetryTime(String configRetryTime) {
this.autoRefresh = autoRefresh; this.configRetryTime = configRetryTime;
} }
public String getDataId() {
return dataId;
}
public void setDataId(String dataId) {
this.dataId = dataId;
}
public String getDataIds() {
return dataIds;
}
public void setDataIds(String dataIds) {
this.dataIds = dataIds;
}
public String getGroup() {
return group;
}
public void setGroup(String group) {
this.group = group;
}
public ConfigType getType() {
return type;
}
public void setType(ConfigType type) {
this.type = type;
}
public String getMaxRetry() {
return maxRetry;
}
public void setMaxRetry(String maxRetry) {
this.maxRetry = maxRetry;
}
public String getConfigLongPollTimeout() {
return configLongPollTimeout;
}
public void setConfigLongPollTimeout(String configLongPollTimeout) {
this.configLongPollTimeout = configLongPollTimeout;
}
public String getConfigRetryTime() {
return configRetryTime;
}
public void setConfigRetryTime(String configRetryTime) {
this.configRetryTime = configRetryTime;
}
public boolean isEnableRemoteSyncConfig() {
return enableRemoteSyncConfig;
}
public void setEnableRemoteSyncConfig(boolean enableRemoteSyncConfig) {
this.enableRemoteSyncConfig = enableRemoteSyncConfig;
}
public boolean isRemoteFirst() {
return remoteFirst;
}
public void setRemoteFirst(boolean remoteFirst) {
this.remoteFirst = remoteFirst;
}
public List<Config> getExtConfig() {
return extConfig;
}
public void setExtConfig(List<Config> extConfig) { public boolean isEnableRemoteSyncConfig() {
this.extConfig = extConfig; return enableRemoteSyncConfig;
} }
public Bootstrap getBootstrap() { public void setEnableRemoteSyncConfig(boolean enableRemoteSyncConfig) {
return bootstrap; this.enableRemoteSyncConfig = enableRemoteSyncConfig;
} }
public void setBootstrap(Bootstrap bootstrap) { public List<Config> getExtConfig() {
this.bootstrap = bootstrap; return extConfig;
} }
@Override public void setExtConfig(List<Config> extConfig) {
public String toString() { this.extConfig = extConfig;
final StringBuffer sb = new StringBuffer("NacosConfigProperties{"); }
sb.append("serverAddr='").append(serverAddr).append('\'');
sb.append(", contextPath='").append(contextPath).append('\'');
sb.append(", encode='").append(encode).append('\'');
sb.append(", endpoint='").append(endpoint).append('\'');
sb.append(", namespace='").append(namespace).append('\'');
sb.append(", accessKey='").append(Objects.isNull(accessKey) ? null : "******").append('\'');
sb.append(", secretKey='").append(Objects.isNull(secretKey) ? null : "******").append('\'');
sb.append(", ramRoleName='").append(ramRoleName).append('\'');
sb.append(", autoRefresh=").append(autoRefresh);
sb.append(", dataId='").append(dataId).append('\'');
sb.append(", dataIds='").append(dataIds).append('\'');
sb.append(", group='").append(group).append('\'');
sb.append(", type=").append(type);
sb.append(", maxRetry='").append(maxRetry).append('\'');
sb.append(", configLongPollTimeout='").append(configLongPollTimeout).append('\'');
sb.append(", configRetryTime='").append(configRetryTime).append('\'');
sb.append(", enableRemoteSyncConfig=").append(enableRemoteSyncConfig);
sb.append(", extConfig=").append(extConfig);
sb.append(", bootstrap=").append(bootstrap);
sb.append('}');
return sb.toString();
}
public static class Bootstrap { public static class Config {
private boolean enable; private String serverAddr;
private boolean logEnable; private String endpoint;
private boolean snapshotEnable; private String namespace;
public boolean isEnable() { private String accessKey;
return enable;
}
public void setEnable(boolean enable) { private String secretKey;
this.enable = enable;
}
public boolean isLogEnable() { private String dataId;
return logEnable;
}
public void setLogEnable(boolean logEnable) { private String group = Constants.DEFAULT_GROUP;
this.logEnable = logEnable;
}
public boolean isSnapshotEnable() { private ConfigType type;
return snapshotEnable;
}
public void setSnapshotEnable(boolean snapshotEnable) { private String maxRetry;
this.snapshotEnable = snapshotEnable;
}
@Override private String configLongPollTimeout;
public String toString() {
final StringBuffer sb = new StringBuffer("Bootstrap{");
sb.append("enable=").append(enable);
sb.append(", snapshotEnable=").append(snapshotEnable);
sb.append(", logEnable=").append(logEnable);
sb.append('}');
return sb.toString();
}
}
public static class Config { private String configRetryTime;
private String serverAddr; private boolean autoRefresh = false;
private String endpoint; private boolean enableRemoteSyncConfig = false;
private String namespace; public String getServerAddr() {
return serverAddr;
}
private String accessKey; public void setServerAddr(String serverAddr) {
this.serverAddr = serverAddr;
}
private String secretKey; public String getEndpoint() {
return endpoint;
}
private String ramRoleName; public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
private String dataId; public String getNamespace() {
return namespace;
}
private String dataIds; public void setNamespace(String namespace) {
this.namespace = namespace;
}
private String group = Constants.DEFAULT_GROUP; public String getAccessKey() {
return accessKey;
}
private ConfigType type; public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
private String maxRetry; public String getSecretKey() {
return secretKey;
}
private String configLongPollTimeout; public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
private String configRetryTime; public String getDataId() {
return dataId;
}
private boolean autoRefresh = false; public void setDataId(String dataId) {
this.dataId = dataId;
}
private boolean enableRemoteSyncConfig = false; public String getGroup() {
return group;
}
private String username; public void setGroup(String group) {
this.group = group;
}
private String password; public ConfigType getType() {
return type;
}
public String getUsername() { public void setType(ConfigType type) {
return username; this.type = type;
} }
public void setUsername(String username) { public String getMaxRetry() {
this.username = username; return maxRetry;
} }
public String getPassword() { public void setMaxRetry(String maxRetry) {
return password; this.maxRetry = maxRetry;
} }
public void setPassword(String password) { public String getConfigLongPollTimeout() {
this.password = password; return configLongPollTimeout;
} }
public String getServerAddr() { public void setConfigLongPollTimeout(String configLongPollTimeout) {
return serverAddr; this.configLongPollTimeout = configLongPollTimeout;
} }
public void setServerAddr(String serverAddr) { public String getConfigRetryTime() {
this.serverAddr = serverAddr; return configRetryTime;
} }
public String getEndpoint() { public void setConfigRetryTime(String configRetryTime) {
return endpoint; this.configRetryTime = configRetryTime;
} }
public void setEndpoint(String endpoint) { public boolean isAutoRefresh() {
this.endpoint = endpoint; return autoRefresh;
} }
public String getNamespace() { public void setAutoRefresh(boolean autoRefresh) {
return namespace; this.autoRefresh = autoRefresh;
} }
public void setNamespace(String namespace) { public boolean isEnableRemoteSyncConfig() {
this.namespace = namespace; return enableRemoteSyncConfig;
} }
public String getAccessKey() { public void setEnableRemoteSyncConfig(boolean enableRemoteSyncConfig) {
return accessKey; this.enableRemoteSyncConfig = enableRemoteSyncConfig;
} }
}
public void setAccessKey(String accessKey) { }
this.accessKey = accessKey;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
public String getRamRoleName() {
return ramRoleName;
}
public void setRamRoleName(String ramRoleName) {
this.ramRoleName = ramRoleName;
}
public String getDataId() {
return dataId;
}
public void setDataId(String dataId) {
this.dataId = dataId;
}
public String getDataIds() {
return dataIds;
}
public void setDataIds(String dataIds) {
this.dataIds = dataIds;
}
public String getGroup() {
return group;
}
public void setGroup(String group) {
this.group = group;
}
public ConfigType getType() {
return type;
}
public void setType(ConfigType type) {
this.type = type;
}
public String getMaxRetry() {
return maxRetry;
}
public void setMaxRetry(String maxRetry) {
this.maxRetry = maxRetry;
}
public String getConfigLongPollTimeout() {
return configLongPollTimeout;
}
public void setConfigLongPollTimeout(String configLongPollTimeout) {
this.configLongPollTimeout = configLongPollTimeout;
}
public String getConfigRetryTime() {
return configRetryTime;
}
public void setConfigRetryTime(String configRetryTime) {
this.configRetryTime = configRetryTime;
}
public boolean isAutoRefresh() {
return autoRefresh;
}
public void setAutoRefresh(boolean autoRefresh) {
this.autoRefresh = autoRefresh;
}
public boolean isEnableRemoteSyncConfig() {
return enableRemoteSyncConfig;
}
public void setEnableRemoteSyncConfig(boolean enableRemoteSyncConfig) {
this.enableRemoteSyncConfig = enableRemoteSyncConfig;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Config{");
sb.append("serverAddr='").append(serverAddr).append('\'');
sb.append(", endpoint='").append(endpoint).append('\'');
sb.append(", namespace='").append(namespace).append('\'');
sb.append(", accessKey='").append(Objects.isNull(accessKey) ? null : "******").append('\'');
sb.append(", secretKey='").append(Objects.isNull(secretKey) ? null : "******").append('\'');
sb.append(", ramRoleName='").append(ramRoleName).append('\'');
sb.append(", dataId='").append(dataId).append('\'');
sb.append(", dataIds='").append(dataIds).append('\'');
sb.append(", group='").append(group).append('\'');
sb.append(", type=").append(type);
sb.append(", maxRetry='").append(maxRetry).append('\'');
sb.append(", configLongPollTimeout='").append(configLongPollTimeout)
.append('\'');
sb.append(", configRetryTime='").append(configRetryTime).append('\'');
sb.append(", autoRefresh=").append(autoRefresh);
sb.append(", enableRemoteSyncConfig=").append(enableRemoteSyncConfig);
sb.append('}');
return sb.toString();
}
}
}

View File

@ -1,95 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.support;
import com.alibaba.nacos.spring.core.env.AbstractNacosPropertySourceBuilder;
import com.alibaba.nacos.spring.core.env.NacosPropertySource;
import com.alibaba.nacos.spring.util.parse.DefaultYamlConfigParse;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
/**
* yaml multi profiles.
* <p>
* read nacos propertysource:
* <p>
* 1. {@link AbstractNacosPropertySourceBuilder#doBuild(String, BeanDefinition, Map)}<br/>
* 2. {@link NacosPropertySource#NacosPropertySource(String, String, String, String, String)}<br/>
* 3. {@link com.alibaba.nacos.spring.util.NacosUtils#toProperties(String, String, String, String)}<br/>
* 4. {@link com.alibaba.nacos.spring.util.ConfigParseUtils#toProperties(String, String, String, String)}<br/>
*
* @author <a href="mailto:yanglu_u@126.com">dbses</a>
*/
public class MultiProfilesYamlConfigParseSupport extends DefaultYamlConfigParse implements EnvironmentPostProcessor {
private static final String SPRING_PROFILES = "spring.profiles";
private static String[] profileArray = {};
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
String[] profiles = environment.getActiveProfiles();
// fall back to default profiles
if (profiles.length == 0) {
profiles = environment.getDefaultProfiles();
}
// set once
if (profileArray.length == 0) {
profileArray = profiles;
}
}
@Override
public Map<String, Object> parse(String configText) {
final AtomicReference<Map<String, Object>> result = new AtomicReference<>();
process(map -> {
// first block
if (result.get() == null) {
result.set(map);
} else {
setFromOtherBlock(result, map);
}
}, createYaml(), configText);
return result.get();
}
private void setFromOtherBlock(AtomicReference<Map<String, Object>> result, Map<String, Object> map) {
if (map.get(SPRING_PROFILES) == null) {
result.get().putAll(map);
return;
}
for (String profile : profileArray) {
if (profile.equals(map.get(SPRING_PROFILES))) {
result.get().putAll(map);
}
}
}
/**
* for unit test
*/
static void setProfileArray(String[] profiles) {
profileArray = profiles;
}
}

View File

@ -1,87 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.util;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.3
*/
public class AttributeExtractTask implements Callable<Map<String, String>> {
private final String prefix;
private final ConfigurableEnvironment environment;
public AttributeExtractTask(String prefix, ConfigurableEnvironment environment) {
this.prefix = prefix;
this.environment = environment;
}
@Override
public Map<String, String> call() throws Exception {
List<Map<String, String>> defer = new LinkedList<>();
MutablePropertySources mutablePropertySources = environment.getPropertySources();
for (PropertySource propertySource : mutablePropertySources) {
calculate(propertySource.getSource(), defer);
}
Map<String, String> result = new HashMap<>(32);
Collections.reverse(defer);
for (Map<String, String> item : defer) {
result.putAll(item);
}
return result;
}
private void calculate(Object source, List<Map<String, String>> defer) {
if (source instanceof PropertySource) {
calculate(((PropertySource) source).getSource(), defer);
}
if (source instanceof Map) {
Map<String, String> map = new HashMap<>(8);
for (Object entry : ((Map) source).entrySet()) {
Map.Entry<Object, Object> element = (Map.Entry<Object, Object>) entry;
String key = String.valueOf(element.getKey());
if (key.startsWith(prefix)) {
map.put(key, String.valueOf(element.getValue()));
}
}
if (!map.isEmpty()) {
defer.add(map);
}
}
if (source instanceof List || source instanceof Set) {
Collection sources = (Collection) source;
for (Object obj : sources) {
calculate(obj, defer);
}
}
}
}

View File

@ -1,233 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Properties;
import java.util.function.Function;
import java.util.stream.Collectors;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.spring.core.env.NacosPropertySource;
import com.alibaba.nacos.spring.core.env.NacosPropertySourcePostProcessor;
import com.alibaba.nacos.spring.util.NacosUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.util.StringUtils;
import static com.alibaba.nacos.spring.util.NacosUtils.buildDefaultPropertySourceName;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @author <a href="mailto:guofuyinan@gmail.com">guofuyinan</a>
* @since 0.2.3
*/
public class NacosConfigLoader {
private final Logger logger = LoggerFactory.getLogger(NacosConfigLoader.class);
private Properties globalProperties = new Properties();
private final Function<Properties, ConfigService> builder;
private final List<DeferNacosPropertySource> nacosPropertySources = new LinkedList<>();
public NacosConfigLoader(Function<Properties, ConfigService> builder) {
this.builder = builder;
}
public void loadConfig(ConfigurableEnvironment environment, NacosConfigProperties nacosConfigProperties) {
globalProperties = buildGlobalNacosProperties(environment, nacosConfigProperties);
MutablePropertySources mutablePropertySources = environment.getPropertySources();
List<NacosPropertySource> sources = reqGlobalNacosConfig(environment, globalProperties, nacosConfigProperties);
for (NacosConfigProperties.Config config : nacosConfigProperties.getExtConfig()) {
List<NacosPropertySource> elements = reqSubNacosConfig(environment, config,
globalProperties, config.getType());
sources.addAll(elements);
}
if (nacosConfigProperties.isRemoteFirst()) {
for (ListIterator<NacosPropertySource> itr = sources.listIterator(sources.size()); itr.hasPrevious();) {
mutablePropertySources.addAfter(
StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, itr.previous());
}
} else {
for (NacosPropertySource propertySource : sources) {
mutablePropertySources.addLast(propertySource);
}
}
}
public Properties buildGlobalNacosProperties(ConfigurableEnvironment environment, NacosConfigProperties nacosConfigProperties) {
return NacosPropertiesBuilder.buildNacosProperties(environment,
nacosConfigProperties.getServerAddr(),
nacosConfigProperties.getNamespace(), nacosConfigProperties.getEndpoint(),
nacosConfigProperties.getSecretKey(),
nacosConfigProperties.getAccessKey(),
nacosConfigProperties.getRamRoleName(),
nacosConfigProperties.getConfigLongPollTimeout(),
nacosConfigProperties.getConfigRetryTime(),
nacosConfigProperties.getMaxRetry(),
nacosConfigProperties.getContextPath(),
nacosConfigProperties.isEnableRemoteSyncConfig(),
nacosConfigProperties.getUsername(), nacosConfigProperties.getPassword());
}
private Properties buildSubNacosProperties(ConfigurableEnvironment environment, Properties globalProperties,
NacosConfigProperties.Config config) {
Properties sub = NacosPropertiesBuilder.buildNacosProperties(environment,
config.getServerAddr(), config.getNamespace(), config.getEndpoint(),
config.getSecretKey(), config.getAccessKey(), config.getRamRoleName(),
config.getConfigLongPollTimeout(), config.getConfigRetryTime(),
config.getMaxRetry(),null, config.isEnableRemoteSyncConfig(),
config.getUsername(), config.getPassword());
NacosPropertiesBuilder.merge(sub, globalProperties);
return sub;
}
private List<NacosPropertySource> reqGlobalNacosConfig(ConfigurableEnvironment environment, Properties globalProperties,
NacosConfigProperties nacosConfigProperties) {
List<String> dataIds = new ArrayList<>();
// Loads all data-id information into the list in the list
if (!StringUtils.hasLength(nacosConfigProperties.getDataId())) {
final String ids = environment
.resolvePlaceholders(nacosConfigProperties.getDataIds());
if(StringUtils.hasText(ids)){
dataIds.addAll(Arrays.stream(ids.split(","))
.filter(StringUtils::hasText)
.collect(Collectors.toList()));
}
}
else {
dataIds.add(nacosConfigProperties.getDataId());
}
final String groupName = environment
.resolvePlaceholders(nacosConfigProperties.getGroup());
final boolean isAutoRefresh = nacosConfigProperties.isAutoRefresh();
return new ArrayList<>(Arrays.asList(reqNacosConfig(environment, globalProperties,
dataIds.toArray(new String[0]), groupName, nacosConfigProperties.getType(), isAutoRefresh)));
}
private List<NacosPropertySource> reqSubNacosConfig(ConfigurableEnvironment environment,
NacosConfigProperties.Config config, Properties globalProperties,
ConfigType type) {
Properties subConfigProperties = buildSubNacosProperties(environment, globalProperties,
config);
ArrayList<String> dataIds = new ArrayList<>();
if (!StringUtils.hasLength(config.getDataId())) {
final String ids = environment.resolvePlaceholders(config.getDataIds());
dataIds.addAll(Arrays.asList(ids.split(",")));
}
else {
dataIds.add(config.getDataId());
}
final String groupName = environment.resolvePlaceholders(config.getGroup());
final boolean isAutoRefresh = config.isAutoRefresh();
return new ArrayList<>(Arrays.asList(reqNacosConfig(environment, subConfigProperties,
dataIds.toArray(new String[0]), groupName, type, isAutoRefresh)));
}
private NacosPropertySource[] reqNacosConfig(ConfigurableEnvironment environment, Properties configProperties,
String[] dataIds, String groupId, ConfigType type, boolean isAutoRefresh) {
final NacosPropertySource[] propertySources = new NacosPropertySource[dataIds.length];
for (int i = 0; i < dataIds.length; i++) {
if (!StringUtils.hasLength(dataIds[i])) {
continue;
}
// Remove excess Spaces
final String dataId = environment.resolvePlaceholders(dataIds[i].trim());
final String config = NacosUtils.getContent(builder.apply(configProperties),
dataId, groupId);
final NacosPropertySource nacosPropertySource = new NacosPropertySource(
dataId, groupId,
buildDefaultPropertySourceName(dataId, groupId, configProperties),
config, type.getType());
nacosPropertySource.setDataId(dataId);
nacosPropertySource.setType(type.getType());
nacosPropertySource.setGroupId(groupId);
nacosPropertySource.setAutoRefreshed(isAutoRefresh);
logger.info("load config from nacos, data-id is : {}, group is : {}",
nacosPropertySource.getDataId(), nacosPropertySource.getGroupId());
propertySources[i] = nacosPropertySource;
DeferNacosPropertySource defer = new DeferNacosPropertySource(
nacosPropertySource, configProperties, environment);
nacosPropertySources.add(defer);
}
return propertySources;
}
public void addListenerIfAutoRefreshed() {
addListenerIfAutoRefreshed(nacosPropertySources);
}
public void addListenerIfAutoRefreshed(
final List<DeferNacosPropertySource> deferNacosPropertySources) {
for (DeferNacosPropertySource deferNacosPropertySource : deferNacosPropertySources) {
NacosPropertySourcePostProcessor.addListenerIfAutoRefreshed(
deferNacosPropertySource.getNacosPropertySource(),
deferNacosPropertySource.getProperties(),
deferNacosPropertySource.getEnvironment());
}
}
public List<DeferNacosPropertySource> getNacosPropertySources() {
return nacosPropertySources;
}
public Properties getGlobalProperties() {
return globalProperties;
}
// Delay Nacos configuration data source object, used for log level of loading time,
// the cache configuration, wait for after the completion of the Spring Context
// created in the release
public static class DeferNacosPropertySource {
private final NacosPropertySource nacosPropertySource;
private final ConfigurableEnvironment environment;
private final Properties properties;
DeferNacosPropertySource(NacosPropertySource nacosPropertySource,
Properties properties, ConfigurableEnvironment environment) {
this.nacosPropertySource = nacosPropertySource;
this.properties = properties;
this.environment = environment;
}
NacosPropertySource getNacosPropertySource() {
return nacosPropertySource;
}
ConfigurableEnvironment getEnvironment() {
return environment;
}
public Properties getProperties() {
return properties;
}
}
}

View File

@ -1,44 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.util;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.nacos.api.config.ConfigService;
import org.springframework.core.env.ConfigurableEnvironment;
import java.util.Properties;
import java.util.function.Function;
/**
* NacosConfigLoaderFactory.
* @author hujun
*/
public class NacosConfigLoaderFactory {
private static volatile NacosConfigLoader nacosConfigLoader;
public static NacosConfigLoader getSingleton(Function<Properties, ConfigService> builder) {
if (nacosConfigLoader == null) {
synchronized (NacosConfigLoaderFactory.class) {
if (nacosConfigLoader == null) {
nacosConfigLoader = new NacosConfigLoader(builder);
}
}
}
return nacosConfigLoader;
}
}

View File

@ -18,38 +18,96 @@ package com.alibaba.boot.nacos.config.util;
import com.alibaba.boot.nacos.config.NacosConfigConstants; import com.alibaba.boot.nacos.config.NacosConfigConstants;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties; import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.boot.nacos.config.util.editor.NacosBooleanEditor;
import com.alibaba.boot.nacos.config.util.editor.NacosEnumEditor;
import com.alibaba.boot.nacos.config.util.editor.NacosStringEditor;
import com.alibaba.nacos.api.config.ConfigType;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanWrapper;
import org.springframework.boot.context.properties.bind.Bindable; import org.springframework.beans.BeanWrapperImpl;
import org.springframework.boot.context.properties.bind.Binder; import org.springframework.beans.propertyeditors.CustomCollectionEditor;
import org.springframework.core.ResolvableType; import org.springframework.boot.env.EnumerableCompositePropertySource;
import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
import java.util.Properties; import java.util.ArrayList;
import java.util.function.Function; import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/** /**
* Springboot used to own property binding configured binding
*
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a> * @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.3 * @since
*/ */
public class NacosConfigPropertiesUtils { public class NacosConfigPropertiesUtils {
private static final Logger logger = LoggerFactory private static final Logger logger = LoggerFactory.getLogger(NacosConfigPropertiesUtils.class);
.getLogger(NacosConfigPropertiesUtils.class);
public static NacosConfigProperties buildNacosConfigProperties( public static NacosConfigProperties buildNacosConfigProperties(ConfigurableEnvironment environment) {
ConfigurableEnvironment environment) { BeanWrapper wrapper = new BeanWrapperImpl(new NacosConfigProperties());
NacosConfigProperties nacosConfigProperties = new NacosConfigProperties(); wrapper.setAutoGrowNestedPaths(true);
Binder binder = Binder.get(environment); wrapper.setExtractOldValueForEditor(true);
ResolvableType type = ResolvableType.forClass(NacosConfigProperties.class); wrapper.registerCustomEditor(String.class, new NacosStringEditor());
Bindable<?> target = Bindable.of(type).withExistingValue(nacosConfigProperties); wrapper.registerCustomEditor(boolean.class, new NacosBooleanEditor());
binder.bind(NacosConfigConstants.PREFIX, target); wrapper.registerCustomEditor(ConfigType.class, new NacosEnumEditor(ConfigType.class));
logger.info("nacosConfigProperties : {}", nacosConfigProperties); wrapper.registerCustomEditor(Collection.class, new CustomCollectionEditor(ArrayList.class));
return nacosConfigProperties; PropertySource target = findApplicationConfig(environment);
} wrapper.setPropertyValues(dataSource((Map<String, Object>) target.getSource()));
NacosConfigProperties nacosConfigProperties = (NacosConfigProperties) wrapper.getWrappedInstance();
logger.info("nacosConfigProperties : {}", nacosConfigProperties);
return nacosConfigProperties;
}
private static PropertySource<Map<String, String>> findApplicationConfig(ConfigurableEnvironment environment) {
PropertySource<Map<String, String>> target = null;
MutablePropertySources mutablePropertySources = environment.getPropertySources();
for (PropertySource tmp : mutablePropertySources) {
// Spring puts the information of the application.properties file into applicationConfigurationProperties.
if ("applicationConfigurationProperties".equals(tmp.getName())) {
ArrayList<Object> list = (ArrayList) tmp.getSource();
for (Object obj : list) {
if (obj instanceof EnumerableCompositePropertySource) {
EnumerableCompositePropertySource propertySource = (EnumerableCompositePropertySource) obj;
target = (PropertySource<Map<String, String>>) propertySource.getSource().iterator().next();
break;
}
}
}
if (target != null) {
break;
}
}
return target;
}
private static Map<String, Object> dataSource(Map<String, Object> source) {
source.remove(NacosConfigConstants.NACOS_BOOTSTRAP);
String prefix = NacosConfigConstants.PREFIX + ".";
HashMap<String, Object> targetConfigInfo = new HashMap<>(source.size());
for (Map.Entry<String, Object> entry : source.entrySet()) {
if (entry.getKey().startsWith(prefix)) {
String key = entry.getKey().replace(prefix, "");
if (key.contains("-")) {
String[] subs = key.split("-");
key = buildJavaField(subs);
}
targetConfigInfo.put(key, entry.getValue());
}
}
return targetConfigInfo;
}
private static String buildJavaField(String[] subs) {
StringBuilder sb = new StringBuilder();
sb.append(subs[0]);
for (int i = 1; i < subs.length; i ++) {
char[] chars = subs[i].toCharArray();
chars[0] = Character.toUpperCase(chars[0]);
sb.append(chars);
}
return sb.toString();
}
} }

View File

@ -16,65 +16,65 @@
*/ */
package com.alibaba.boot.nacos.config.util; package com.alibaba.boot.nacos.config.util;
import com.alibaba.nacos.api.PropertyKeyConst;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import com.alibaba.nacos.api.PropertyKeyConst;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.env.Environment;
import org.springframework.util.CollectionUtils;
/** /**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a> * @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.3 * @since
*/ */
public class NacosPropertiesBuilder { public class NacosPropertiesBuilder {
public static Properties buildNacosProperties(Environment environment, public static Properties buildNacosProperties(String serverAddr, String namespaceId, String endpoint, String secreyKey,
String serverAddr, String namespaceId, String endpoint, String secretKey, String accessKey, String configLongPollTimeout, String configRetryTimeout, String maxRetry, boolean enableRemoteSyncConfig) {
String accessKey, String ramRoleName, String configLongPollTimeout,
String configRetryTimeout, String maxRetry,String contextPath, boolean enableRemoteSyncConfig,
String username, String password) {
Properties properties = new Properties();
processPropertiesData(properties,environment,serverAddr,PropertyKeyConst.SERVER_ADDR);
processPropertiesData(properties,environment,namespaceId,PropertyKeyConst.NAMESPACE);
processPropertiesData(properties,environment,endpoint,PropertyKeyConst.ENDPOINT);
processPropertiesData(properties,environment,secretKey,PropertyKeyConst.SECRET_KEY);
processPropertiesData(properties,environment,accessKey,PropertyKeyConst.ACCESS_KEY);
processPropertiesData(properties,environment,ramRoleName,PropertyKeyConst.RAM_ROLE_NAME);
processPropertiesData(properties,environment,configLongPollTimeout,PropertyKeyConst.CONFIG_LONG_POLL_TIMEOUT);
processPropertiesData(properties,environment,configRetryTimeout,PropertyKeyConst.CONFIG_RETRY_TIME);
processPropertiesData(properties,environment,contextPath,PropertyKeyConst.CONTEXT_PATH);
processPropertiesData(properties,environment,maxRetry,PropertyKeyConst.MAX_RETRY);
processPropertiesData(properties,environment,username,PropertyKeyConst.USERNAME);
processPropertiesData(properties,environment,password,PropertyKeyConst.PASSWORD);
properties.put(PropertyKeyConst.ENABLE_REMOTE_SYNC_CONFIG,
String.valueOf(enableRemoteSyncConfig));
return properties;
}
private static void processPropertiesData(Properties properties,Environment environment,String keyword,String key) {
if (StringUtils.isNotBlank(keyword)) {
properties.put(key ,environment.resolvePlaceholders(keyword));
}
}
public static void merge(Properties targetProperties, Properties sourceProperties) { Properties properties = new Properties();
if (StringUtils.isNotEmpty(serverAddr)) {
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
}
if (StringUtils.isNotEmpty(namespaceId)) {
properties.put(PropertyKeyConst.NAMESPACE, namespaceId);
}
if (StringUtils.isNotEmpty(endpoint)) {
properties.put(PropertyKeyConst.ENDPOINT, endpoint);
}
if (StringUtils.isNotEmpty(secreyKey)) {
properties.put(PropertyKeyConst.SECRET_KEY, secreyKey);
}
if (StringUtils.isNotEmpty(accessKey)) {
properties.put(PropertyKeyConst.ACCESS_KEY, accessKey);
}
if (StringUtils.isNotEmpty(configLongPollTimeout)) {
properties.put(PropertyKeyConst.CONFIG_LONG_POLL_TIMEOUT, configLongPollTimeout);
}
if (StringUtils.isNotEmpty(configRetryTimeout)) {
properties.put(PropertyKeyConst.CONFIG_RETRY_TIME, configRetryTimeout);
}
if (StringUtils.isNotEmpty(maxRetry)) {
properties.put(PropertyKeyConst.MAX_RETRY, maxRetry);
}
properties.put(PropertyKeyConst.ENABLE_REMOTE_SYNC_CONFIG, String.valueOf(enableRemoteSyncConfig));
return properties;
}
if (CollectionUtils.isEmpty(sourceProperties)) { public static void merge(Properties targetProperties, Properties sourceProperties) {
return;
}
for (Map.Entry entry : sourceProperties.entrySet()) { if (CollectionUtils.isEmpty(sourceProperties)) {
String propertyName = (String) entry.getKey(); return;
if (!targetProperties.containsKey(propertyName)) { }
String propertyValue = (String) entry.getValue();
targetProperties.setProperty(propertyName, propertyValue);
}
}
} for (Map.Entry entry : sourceProperties.entrySet()) {
String propertyName = (String) entry.getKey();
if (!targetProperties.containsKey(propertyName)) {
String propertyValue = (String) entry.getValue();
targetProperties.setProperty(propertyName, propertyValue);
}
}
} }
}

View File

@ -0,0 +1,70 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.util.editor;
import java.beans.PropertyEditorSupport;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since
*/
public class NacosBooleanEditor extends PropertyEditorSupport {
public NacosBooleanEditor() {
}
@Override
public String getJavaInitializationString() {
Object var1 = this.getValue();
return var1 != null ? var1.toString() : "null";
}
@Override
public String getAsText() {
Object var1 = this.getValue();
return var1 instanceof Boolean ? this.getValidName((Boolean)var1) : null;
}
@Override
public void setAsText(String var1) throws IllegalArgumentException {
if (var1 == null) {
this.setValue((Object)null);
} else if (this.isValidName(true, var1)) {
this.setValue(Boolean.TRUE);
} else {
if (!this.isValidName(false, var1)) {
throw new IllegalArgumentException(var1);
}
this.setValue(Boolean.FALSE);
}
}
@Override
public String[] getTags() {
return new String[]{this.getValidName(true), this.getValidName(false)};
}
private String getValidName(boolean var1) {
return var1 ? "True" : "False";
}
private boolean isValidName(boolean var1, String var2) {
return this.getValidName(var1).equalsIgnoreCase(var2);
}
}

View File

@ -1,46 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.util.editor;
import java.beans.PropertyEditorSupport;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.3
*/
public class NacosCharSequenceEditor extends PropertyEditorSupport {
@Override
public void setValue(Object value) {
if (value == null) {
super.setValue("");
}
if (value instanceof CharSequence) {
CharSequence sequence = (CharSequence) value;
super.setValue(sequence.toString());
}
else {
super.setValue(value);
}
}
@Override
public String getAsText() {
Object value = getValue();
return String.valueOf(value);
}
}

View File

@ -1,107 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.util.editor;
import java.beans.PropertyEditorSupport;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.3
*/
public class NacosCustomBooleanEditor extends PropertyEditorSupport {
public static final String VALUE_TRUE = "true";
public static final String VALUE_FALSE = "false";
public static final String VALUE_ON = "on";
public static final String VALUE_OFF = "off";
public static final String VALUE_YES = "yes";
public static final String VALUE_NO = "no";
public static final String VALUE_1 = "1";
public static final String VALUE_0 = "0";
@Nullable
private final String trueString;
@Nullable
private final String falseString;
private final boolean allowEmpty;
public NacosCustomBooleanEditor(boolean allowEmpty) {
this(null, null, allowEmpty);
}
public NacosCustomBooleanEditor(@Nullable String trueString,
@Nullable String falseString, boolean allowEmpty) {
this.trueString = trueString;
this.falseString = falseString;
this.allowEmpty = allowEmpty;
}
@Override
public void setValue(Object value) {
super.setValue(convert(String.valueOf(value)));
}
public Object convert(String text) throws IllegalArgumentException {
String input = (text != null ? text.trim() : null);
if (this.allowEmpty && !StringUtils.hasLength(input)) {
// Treat empty String as null value.
return null;
}
else if (this.trueString != null && this.trueString.equalsIgnoreCase(input)) {
return Boolean.TRUE;
}
else if (this.falseString != null && this.falseString.equalsIgnoreCase(input)) {
return Boolean.FALSE;
}
else if (this.trueString == null
&& (VALUE_TRUE.equalsIgnoreCase(input) || VALUE_ON.equalsIgnoreCase(input)
|| VALUE_YES.equalsIgnoreCase(input) || VALUE_1.equals(input))) {
return Boolean.TRUE;
}
else if (this.falseString == null && (VALUE_FALSE.equalsIgnoreCase(input)
|| VALUE_OFF.equalsIgnoreCase(input) || VALUE_NO.equalsIgnoreCase(input)
|| VALUE_0.equals(input))) {
return Boolean.FALSE;
}
else {
throw new IllegalArgumentException("Invalid boolean value [" + text + "]");
}
}
@Override
public String getAsText() {
String t = String.valueOf(getValue());
if (Boolean.TRUE.equals(Boolean.valueOf(t))) {
return (this.trueString != null ? this.trueString : VALUE_TRUE);
}
else if (Boolean.FALSE.equals(Boolean.valueOf(t))) {
return (this.falseString != null ? this.falseString : VALUE_FALSE);
}
else {
return "";
}
}
}

View File

@ -16,7 +16,9 @@
*/ */
package com.alibaba.boot.nacos.config.util.editor; package com.alibaba.boot.nacos.config.util.editor;
import java.awt.*; import java.awt.Component;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.beans.PropertyEditor; import java.beans.PropertyEditor;
@ -25,132 +27,128 @@ import java.util.List;
/** /**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a> * @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.3 * @since
*/ */
public class NacosEnumEditor implements PropertyEditor { public class NacosEnumEditor implements PropertyEditor {
private final List<PropertyChangeListener> listeners = new ArrayList<>(8); private final List<PropertyChangeListener> listeners = new ArrayList();
private final Class type; private final Class type;
private final String[] tags; private final String[] tags;
private Object value; private Object value;
public NacosEnumEditor(Class var1) { public NacosEnumEditor(Class var1) {
Object[] var2 = var1.getEnumConstants(); Object[] var2 = var1.getEnumConstants();
if (var2 == null) { if (var2 == null) {
throw new IllegalArgumentException("Unsupported " + var1); throw new IllegalArgumentException("Unsupported " + var1);
} } else {
else { this.type = var1;
this.type = var1; this.tags = new String[var2.length];
this.tags = new String[var2.length];
for (int var3 = 0; var3 < var2.length; ++var3) { for (int var3 = 0; var3 < var2.length; ++var3) {
this.tags[var3] = ((Enum) var2[var3]).name(); this.tags[var3] = ((Enum) var2[var3]).name();
} }
} }
} }
@Override @Override
public Object getValue() { public Object getValue() {
return this.value; return this.value;
} }
@Override @Override
public void setValue(Object var1) { public void setValue(Object var1) {
if (var1 != null && !this.type.isInstance(var1)) { if (var1 != null && !this.type.isInstance(var1)) {
throw new IllegalArgumentException("Unsupported value: " + var1); throw new IllegalArgumentException("Unsupported value: " + var1);
} } else {
else { Object var2;
Object var2; PropertyChangeListener[] var3;
PropertyChangeListener[] var3; synchronized(this.listeners) {
synchronized (this.listeners) { label45: {
label45: { var2 = this.value;
var2 = this.value; this.value = var1;
this.value = var1; if (var1 == null) {
if (var1 == null) { if (var2 != null) {
if (var2 != null) { break label45;
break label45; }
} } else if (!var1.equals(var2)) {
} break label45;
else if (!var1.equals(var2)) { }
break label45;
}
return; return;
} }
int var5 = this.listeners.size(); int var5 = this.listeners.size();
if (var5 == 0) { if (var5 == 0) {
return; return;
} }
var3 = (PropertyChangeListener[]) this.listeners var3 = (PropertyChangeListener[])this.listeners.toArray(new PropertyChangeListener[var5]);
.toArray(new PropertyChangeListener[var5]); }
}
PropertyChangeEvent var4 = new PropertyChangeEvent(this, (String) null, var2, PropertyChangeEvent var4 = new PropertyChangeEvent(this, (String)null, var2, var1);
var1); PropertyChangeListener[] var10 = var3;
PropertyChangeListener[] var10 = var3; int var6 = var3.length;
int var6 = var3.length;
for (int var7 = 0; var7 < var6; ++var7) { for(int var7 = 0; var7 < var6; ++var7) {
PropertyChangeListener var8 = var10[var7]; PropertyChangeListener var8 = var10[var7];
var8.propertyChange(var4); var8.propertyChange(var4);
} }
} }
} }
@Override @Override
public String getAsText() { public String getAsText() {
return this.value != null ? ((Enum) this.value).name() : null; return this.value != null ? ((Enum) this.value).name() : null;
} }
@Override @Override
public void setAsText(String var1) { public void setAsText(String var1) {
this.setValue(var1 != null ? Enum.valueOf(this.type, var1.toUpperCase()) : null); this.setValue(var1 != null ? Enum.valueOf(this.type, var1.toUpperCase()) : null);
} }
@Override @Override
public String[] getTags() { public String[] getTags() {
return (String[]) this.tags.clone(); return (String[]) this.tags.clone();
} }
@Override @Override
public String getJavaInitializationString() { public String getJavaInitializationString() {
String var1 = this.getAsText(); String var1 = this.getAsText();
return var1 != null ? this.type.getName() + '.' + var1 : "null"; return var1 != null ? this.type.getName() + '.' + var1 : "null";
} }
@Override @Override
public boolean isPaintable() { public boolean isPaintable() {
return false; return false;
} }
@Override @Override
public void paintValue(Graphics var1, Rectangle var2) { public void paintValue(Graphics var1, Rectangle var2) {
} }
@Override @Override
public boolean supportsCustomEditor() { public boolean supportsCustomEditor() {
return false; return false;
} }
@Override @Override
public Component getCustomEditor() { public Component getCustomEditor() {
return null; return null;
} }
@Override @Override
public void addPropertyChangeListener(PropertyChangeListener var1) { public void addPropertyChangeListener(PropertyChangeListener var1) {
synchronized (this.listeners) { synchronized (this.listeners) {
this.listeners.add(var1); this.listeners.add(var1);
} }
} }
@Override
public void removePropertyChangeListener(PropertyChangeListener var1) {
synchronized (this.listeners) {
this.listeners.remove(var1);
}
}
@Override
public void removePropertyChangeListener(PropertyChangeListener var1) {
synchronized (this.listeners) {
this.listeners.remove(var1);
}
}
} }

View File

@ -0,0 +1,95 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.util.editor;
import java.beans.PropertyEditorSupport;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since
*/
public class NacosStringEditor extends PropertyEditorSupport {
public NacosStringEditor() {
}
@Override
public String getJavaInitializationString() {
Object var1 = this.getValue();
if (var1 == null) {
return "null";
} else {
String var2 = var1.toString();
int var3 = var2.length();
StringBuilder var4 = new StringBuilder(var3 + 2);
var4.append('"');
for(int var5 = 0; var5 < var3; ++var5) {
char var6 = var2.charAt(var5);
String var7;
int var8;
switch(var6) {
case '\b':
var4.append("\\b");
continue;
case '\t':
var4.append("\\t");
continue;
case '\n':
var4.append("\\n");
continue;
case '\f':
var4.append("\\f");
continue;
case '\r':
var4.append("\\r");
continue;
case '"':
var4.append("\\\"");
continue;
case '\\':
var4.append("\\\\");
continue;
default:
if (var6 >= ' ' && var6 <= '~') {
var4.append(var6);
continue;
}
var4.append("\\u");
var7 = Integer.toHexString(var6);
var8 = var7.length();
}
while(var8 < 4) {
var4.append('0');
++var8;
}
var4.append(var7);
}
var4.append('"');
return var4.toString();
}
}
@Override
public void setAsText(String var1) {
this.setValue(var1);
}
}

View File

@ -1,149 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.util.log;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.boot.nacos.config.util.NacosConfigLoader;
import com.alibaba.nacos.api.common.Constants;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.AbstractListener;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.client.config.utils.ConcurrentDiskUtil;
import com.alibaba.nacos.client.config.utils.JvmUtil;
import com.alibaba.nacos.client.logging.NacosLogging;
import com.alibaba.nacos.client.utils.LogUtils;
import com.alibaba.nacos.common.utils.IoUtils;
import com.alibaba.nacos.common.utils.StringUtils;
import com.alibaba.nacos.spring.util.NacosUtils;
import org.slf4j.Logger;
import org.springframework.boot.context.logging.LoggingApplicationListener;
import org.springframework.boot.logging.LoggingInitializationContext;
import org.springframework.boot.logging.LoggingSystem;
import org.springframework.boot.logging.LoggingSystemFactory;
import org.springframework.core.env.ConfigurableEnvironment;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.function.Function;
/**
* Start:
* Step1: get the log XML configuration from the configuration center
* Step2: modify the springboot log configuration path
* Modifying log configuration during operation:
* Clean up the configuration through LoggingSystem and reload the configuration.
*
* @author <a href="mailto:hujun3@xiaomi.com">hujun</a>
*/
public class LogAutoFreshProcess {
private static final Logger LOGGER = LogUtils.logger(LogAutoFreshProcess.class);
private final NacosConfigProperties nacosConfigProperties;
private final ConfigurableEnvironment environment;
private final NacosConfigLoader nacosConfigLoader;
private final Function<Properties, ConfigService> builder;
private static final List<String> LOG_DATA_ID = new ArrayList<>();
private static final String LOG_CACHE_BASE = System.getProperty("JM.SNAPSHOT.PATH", System.getProperty("user.home")) + File.separator + "nacos"
+ File.separator + "logConfig";
static {
LOG_DATA_ID.add("logback.xml");
LOG_DATA_ID.add("log4j2.xml");
}
public static LogAutoFreshProcess build(ConfigurableEnvironment environment, NacosConfigProperties nacosConfigProperties, NacosConfigLoader nacosConfigLoader, Function<Properties, ConfigService> builder) {
return new LogAutoFreshProcess(environment, nacosConfigProperties, nacosConfigLoader, builder);
}
private LogAutoFreshProcess(ConfigurableEnvironment environment, NacosConfigProperties nacosConfigProperties, NacosConfigLoader nacosConfigLoader, Function<Properties, ConfigService> builder) {
this.nacosConfigProperties = nacosConfigProperties;
this.environment = environment;
this.nacosConfigLoader = nacosConfigLoader;
this.builder = builder;
}
public void process() {
final String groupName = environment
.resolvePlaceholders(nacosConfigProperties.getGroup());
ConfigService configService = builder.apply(nacosConfigLoader.getGlobalProperties());
for (String dataId : LOG_DATA_ID) {
String content = NacosUtils.getContent(configService, dataId, groupName);
if (StringUtils.isNotBlank(content)) {
writeLogFile(content, dataId);
System.setProperty(LoggingApplicationListener.CONFIG_PROPERTY, LOG_CACHE_BASE + File.separator + dataId);
registerListener(configService, dataId, groupName);
return;
}
}
}
private void registerListener(ConfigService configService, String dataId, String groupName) {
try {
configService.addListener(dataId, groupName, new AbstractListener() {
@Override
public void receiveConfigInfo(String configInfo) {
if (StringUtils.isNotBlank(configInfo)) {
writeLogFile(configInfo, dataId);
reloadConfig(LOG_CACHE_BASE + File.separator + dataId);
}
}
});
} catch (NacosException e) {
throw new RuntimeException("ConfigService can't add Listener with dataId : " + dataId, e);
}
}
private void writeLogFile(String content, String dataId) {
File file = new File(LOG_CACHE_BASE, dataId);
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
boolean isMdOk = parentFile.mkdirs();
if (!isMdOk) {
LOGGER.error("save log cache error");
}
}
try {
if (JvmUtil.isMultiInstance()) {
ConcurrentDiskUtil.writeFileContent(file, content, Constants.ENCODE);
} else {
IoUtils.writeStringToFile(file, content, Constants.ENCODE);
}
} catch (IOException e) {
throw new RuntimeException("write log file fail");
}
}
private void reloadConfig(String logPath) {
LoggingSystem loggingSystem = LoggingSystemFactory.fromSpringFactories()
.getLoggingSystem(this.getClass().getClassLoader());
loggingSystem.cleanUp();
loggingSystem.initialize(new LoggingInitializationContext(environment),
logPath, null);
NacosLogging.getInstance().loadConfiguration();
}
}

View File

@ -1,9 +0,0 @@
{
"resources": {
"includes": [
{
"pattern": "\\QMETA-INF/services/com.alibaba.nacos.spring.util.ConfigParse\\E"
}
]
}
}

View File

@ -1 +0,0 @@
com.alibaba.boot.nacos.config.support.MultiProfilesYamlConfigParseSupport

View File

@ -0,0 +1,110 @@
{
"hints": [ ],
"groups": [ ],
"properties": [
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.enabled",
"description": "enable or disable nacos config feature",
"type": "java.lang.Boolean"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.server-addr",
"description": "the server address of nacos",
"type": "java.lang.String"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.context-path",
"description": "the context path of nacos server",
"type": "java.lang.String"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.encode",
"description": "encode of reading nacos properties",
"type": "java.lang.String"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.endpoint",
"description": "the entry domain name of a service in each region",
"type": "java.lang.String"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.namespace",
"description": "for configuration isolation by tenants. Different namespaces may have configurations with the same Group or Data ID. ",
"type": "java.lang.String"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.access-key",
"description": "the accesskey of Alibaba Cloud Account",
"type": "java.lang.String"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.secret-key",
"description": "the secretkey of Alibaba Cloud Account",
"type": "java.lang.String"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.data-id",
"type": "java.lang.String"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.group",
"type": "java.lang.String"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.auto-refresh",
"type": "java.lang.Boolean"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.max-retry",
"description": "the secretkey of Alibaba Cloud Account",
"type": "java.lang.String"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.config-long-poll-timeout",
"description": "the secretkey of Alibaba Cloud Account",
"type": "java.lang.String"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.config-retry-time",
"description": "the secretkey of Alibaba Cloud Account",
"type": "java.lang.String"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.type",
"description": "the secretkey of Alibaba Cloud Account",
"type": "com.alibaba.nacos.api.config.ConfigType"
},{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.enable-remote-sync-config",
"description": "the secretkey of Alibaba Cloud Account",
"type": "java.lang.Boolean"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.bootstrap.enable",
"description": "the secretkey of Alibaba Cloud Account",
"type": "java.lang.String"
},
{
"sourceType": "com.alibaba.boot.nacos.config.properties.NacosConfigProperties",
"name": "nacos.config.ext-config",
"description": "the secretkey of Alibaba Cloud Account",
"type": "java.util.List<com.alibaba.boot.nacos.config.properties.NacosConfigProperties.Config>"
}
]
}

View File

@ -1,9 +1,4 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration
#org.springframework.context.ApplicationContextInitializer=\ org.springframework.context.ApplicationContextInitializer=\
# com.alibaba.boot.nacos.config.autoconfigure.NacosConfigApplicationContextInitializer com.alibaba.boot.nacos.config.autoconfigure.NacosConfigApplicationInitializer
org.springframework.boot.env.EnvironmentPostProcessor=\
com.alibaba.boot.nacos.config.autoconfigure.NacosConfigEnvironmentProcessor,\
com.alibaba.boot.nacos.config.support.MultiProfilesYamlConfigParseSupport
org.springframework.context.ApplicationListener=\
com.alibaba.boot.nacos.config.logging.NacosLoggingListener

View File

@ -1,4 +0,0 @@
com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration
com.alibaba.boot.nacos.config.autoconfigure.NacosConfigEnvironmentProcessor
com.alibaba.boot.nacos.config.support.MultiProfilesYamlConfigParseSupport
com.alibaba.boot.nacos.config.logging.NacosLoggingListener

View File

@ -1,46 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.autoconfigure;
import com.alibaba.boot.nacos.config.autoconfigure.NacosBootConfigException;
import org.junit.Assert;
import org.junit.Test;
/**
* {@link NacosBootConfigException} Test
* @ClassName: NacosBootConfigExceptionTest
* @Author: ChenHao26
* @Date: 2022/8/12 15:56
*/
public class NacosBootConfigExceptionTest {
@Test
public void getCons() {
try {
testMethod("spring boot");
}catch (Exception e) {
Assert.assertTrue(e instanceof NacosBootConfigException);
}
}
private void testMethod(String str) {
if (str.startsWith("spring")) {
throw new NacosBootConfigException(new Throwable());
}
}
}

View File

@ -1,79 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.autoconfigure;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigApplicationContextInitializer;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigBootBeanDefinitionRegistrar;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigEnvironmentProcessor;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.boot.nacos.config.util.NacosConfigLoader;
import com.alibaba.boot.nacos.config.util.NacosConfigLoaderFactory;
import com.alibaba.boot.nacos.config.util.NacosConfigPropertiesUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* {@link NacosConfigApplicationContextInitializer} Test
* @ClassName: NacosConfigApplicationContextInitializerTest
* @Author: ChenHao26
* @Date: 2022/8/12 15:25
*/
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = { "nacos.config.server-addr=localhost" })
@SpringBootTest(classes = { NacosConfigAutoConfiguration.class })
public class NacosConfigApplicationContextInitializerTest {
private NacosConfigApplicationContextInitializer nacosConfigApplicationContextInitializer;
@Autowired
private ConfigurableEnvironment environment;
@Autowired
private NacosConfigProperties nacosConfigProperties;
@Autowired
private ConfigurableApplicationContext context;
@Before
public void testNacosConfigApplicationContextInitializer() {
nacosConfigApplicationContextInitializer = new NacosConfigApplicationContextInitializer(new NacosConfigEnvironmentProcessor());
}
@Test
public void initialize(){
try {
nacosConfigProperties = NacosConfigPropertiesUtils
.buildNacosConfigProperties(environment);
Assert.assertNotNull(nacosConfigProperties);
NacosConfigLoader singleton = NacosConfigLoaderFactory.getSingleton(null);
Assert.assertNotNull(singleton);
nacosConfigApplicationContextInitializer.initialize(context);
} catch (Exception e) {
Assert.assertNotNull(e);
}
}
}

View File

@ -16,10 +16,7 @@
*/ */
package com.alibaba.boot.nacos.autoconfigure; package com.alibaba.boot.nacos.autoconfigure;
import java.util.Properties;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration; import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
import com.alibaba.boot.nacos.config.binder.NacosBootConfigurationPropertiesBinder;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties; import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.nacos.api.PropertyKeyConst; import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.annotation.NacosInjected; import com.alibaba.nacos.api.annotation.NacosInjected;
@ -28,7 +25,6 @@ import com.alibaba.nacos.spring.util.NacosBeanUtils;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
@ -36,6 +32,8 @@ import org.springframework.context.ApplicationContext;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Properties;
/** /**
* {@link NacosConfigAutoConfiguration} Test * {@link NacosConfigAutoConfiguration} Test
* *
@ -43,50 +41,46 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
* @see NacosConfigAutoConfiguration * @see NacosConfigAutoConfiguration
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = { "nacos.config.server-addr=localhost" }) @TestPropertySource(
@SpringBootTest(classes = { NacosConfigAutoConfiguration.class }) properties = {
"nacos.config.server-addr=localhost"
}
)
@SpringBootTest(
classes = {NacosConfigAutoConfiguration.class}
)
public class NacosConfigAutoConfigurationTest { public class NacosConfigAutoConfigurationTest {
@Autowired @Autowired
private NacosConfigProperties nacosConfigProperties; private NacosConfigProperties nacosConfigProperties;
@Autowired @Autowired
private ApplicationContext applicationContext; private ApplicationContext applicationContext;
@NacosInjected @NacosInjected
private ConfigService configService; private ConfigService configService;
@Test @Test
public void testNacosConfig() { public void testNacosConfig() {
Assert.assertNotNull(configService); Assert.assertNotNull(configService);
Assert.assertNotNull(applicationContext Assert.assertNotNull(applicationContext.getBean(NacosBeanUtils.CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME));
.getBean(NacosBeanUtils.CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME)); Assert.assertEquals("localhost", nacosConfigProperties.getServerAddr());
Assert.assertEquals("localhost", nacosConfigProperties.getServerAddr()); }
}
@Test @Test(expected = NoSuchBeanDefinitionException.class)
public void testNacosConfigGlobalBean() { public void testNacosConfigGlobalBean() {
Assert.assertNotNull(applicationContext Assert.assertNull(applicationContext.getBean(NacosBeanUtils.GLOBAL_NACOS_PROPERTIES_BEAN_NAME));
.getBean(NacosBeanUtils.GLOBAL_NACOS_PROPERTIES_BEAN_NAME)); }
}
@Test(expected = NoSuchBeanDefinitionException.class) @Test(expected = NoSuchBeanDefinitionException.class)
public void testNacosDiscoveryGlobalBean() { public void testNacosDiscoveryGlobalBean() {
Assert.assertNull(applicationContext Assert.assertNull(applicationContext.getBean(NacosBeanUtils.DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME));
.getBean(NacosBeanUtils.DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME)); }
}
@Test @Test
public void testNacosGlobalProperties() { public void testNacosGlobalProperties() {
Properties properties = applicationContext.getBean( Properties properties = applicationContext.getBean(NacosBeanUtils.CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME, Properties.class);
NacosBeanUtils.CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME, Assert.assertEquals("localhost", properties.getProperty(PropertyKeyConst.SERVER_ADDR));
Properties.class); }
Assert.assertEquals("localhost",
properties.getProperty(PropertyKeyConst.SERVER_ADDR));
}
@Test
public void testNacosConfigBootBeanDefinitionRegistrar() {
Assert.assertNotNull(applicationContext.getBean(NacosBootConfigurationPropertiesBinder.BEAN_NAME));
}
} }

View File

@ -1,69 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.autoconfigure;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigBootBeanDefinitionRegistrar;
import com.alibaba.boot.nacos.config.binder.NacosBootConfigurationPropertiesBinder;
import com.alibaba.nacos.client.utils.LogUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* {@link NacosConfigBootBeanDefinitionRegistrar} Test
* @ClassName: NacosConfigBootBeanDefinitionRegistrarTest
* @Author: ChenHao26
* @Date: 2022/8/12 15:38
*/
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = { "nacos.config.server-addr=localhost" })
@SpringBootTest(classes = { NacosConfigAutoConfiguration.class })
public class NacosConfigBootBeanDefinitionRegistrarTest {
private static final Logger LOGGER = LogUtils.logger(NacosConfigBootBeanDefinitionRegistrarTest.class);
private NacosConfigBootBeanDefinitionRegistrar nacosConfigBootBeanDefinitionRegistrar;
@Before
public void setup() {
nacosConfigBootBeanDefinitionRegistrar = new NacosConfigBootBeanDefinitionRegistrar();
}
@Test
public void setBeanFactory(){
try {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition("beanName");
Assert.assertNotNull(builder);
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
nacosConfigBootBeanDefinitionRegistrar.setBeanFactory(beanFactory);
Assert.assertNotNull(beanFactory.getBeanDefinition(NacosBootConfigurationPropertiesBinder.BEAN_NAME));
nacosConfigBootBeanDefinitionRegistrar.setBeanFactory(beanFactory);
}catch (Exception e) {
LOGGER.error("error info: {}",e.toString());
Assert.assertNull(e);
}
}
}

View File

@ -1,85 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.autoconfigure;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigEnvironmentProcessor;
import com.alibaba.boot.nacos.config.binder.NacosBootConfigurationPropertiesBinder;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.boot.nacos.config.util.NacosConfigPropertiesUtils;
import com.alibaba.nacos.client.config.NacosConfigService;
import com.alibaba.nacos.client.utils.LogUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* {@link NacosBootConfigurationPropertiesBinder} Test
* @ClassName: NacosConfigEnvironmentProcessorTest
* @Author: ChenHao26
* @Date: 2022/8/12 15:43
*/
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = { "nacos.config.server-addr=localhost" })
@SpringBootTest(classes = { NacosConfigAutoConfiguration.class })
public class NacosConfigEnvironmentProcessorTest {
private NacosConfigEnvironmentProcessor nacosConfigEnvironmentProcessor;
@Autowired
private ConfigurableEnvironment environment;
private static final Logger LOGGER = LogUtils.logger(NacosConfigEnvironmentProcessorTest.class);
@Mock
private NacosConfigProperties nacosConfigProperties;
@Before
public void setup() {
nacosConfigEnvironmentProcessor = new NacosConfigEnvironmentProcessor();
}
@Test
public void postProcessEnvironment() {
try {
NacosConfigProperties nacosConfigProperties1 = NacosConfigPropertiesUtils.buildNacosConfigProperties(
environment);
Assert.assertFalse(nacosConfigProperties1.isEnableRemoteSyncConfig());
nacosConfigEnvironmentProcessor.postProcessEnvironment(environment, new SpringApplication());
}catch (Exception e) {
LOGGER.error("error info :{} ",e);
Assert.assertNull(e);
}
}
@Test
public void getOrder() {
int order = nacosConfigEnvironmentProcessor.getOrder();
Assert.assertNotNull(order);
}
}

View File

@ -1,108 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.binder;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
import com.alibaba.boot.nacos.config.binder.NacosBootConfigurationPropertiesBinder;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.spring.context.event.config.EventPublishingConfigService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.lang.reflect.Method;
/**
* {@link NacosBootConfigurationPropertiesBinder} Test
* @ClassName: NacosBootConfigurationPropertiesBinderTest
* @Author: ChenHao26
* @Date: 2022/8/12 16:00
*/
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = { "nacos.config.server-addr=localhost" })
@SpringBootTest(classes = { NacosConfigAutoConfiguration.class })
public class NacosBootConfigurationPropertiesBinderTest {
private Binder binder;
@Autowired
private ConfigurableApplicationContext context;
@Before
public void setup() {
binder = new Binder(context);
}
@Test
public void findFactoryMethod(){
Method beanName = binder.findFactoryMethod(NacosBootConfigurationPropertiesBinder.BEAN_NAME);
Assert.assertNull(beanName);
}
@Test
public void testDoBind() {
People people = new People();
binder.doBind(people, "people", "people", "people", "properties",
People.class.getAnnotation(NacosConfigurationProperties.class), "people.name=SuperZ1999\npeople.age=24",
new EventPublishingConfigService(null, null, context, null));
Assert.assertEquals(people.getName(), "SuperZ1999");
Assert.assertEquals(people.getAge(), 24);
}
static class Binder extends NacosBootConfigurationPropertiesBinder {
public Binder(ConfigurableApplicationContext applicationContext) {
super(applicationContext);
}
@Override
protected void doBind(Object bean, String beanName, String dataId, String groupId, String configType, NacosConfigurationProperties properties, String content, ConfigService configService) {
super.doBind(bean, beanName, dataId, groupId, configType, properties, content, configService);
}
}
@NacosConfigurationProperties(prefix = "people", dataId = "people", groupId = "people")
static class People {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
}

View File

@ -1,162 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.config.support;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
import com.alibaba.nacos.spring.util.ConfigParseUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.Environment;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* {@link MultiProfilesYamlConfigParseSupport} Test
*
* @author <a href="mailto:yanglu_u@126.com">dbses</a>
*/
public class MultiProfilesYamlConfigParseSupportTest {
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({"alpha"})
@SpringBootTest(classes = {NacosConfigAutoConfiguration.class})
public static class OneProfiles {
@Autowired
private Environment environment;
@Before
public void setUp() {
// because MultiProfilesYamlConfigParseSupport # postProcessEnvironment() run once,
// so it should set profilesArray before test
MultiProfilesYamlConfigParseSupport.setProfileArray(environment.getActiveProfiles());
}
@Test
public void oneProfiles_normal() {
String content = "test1:\n" +
" config: 2\n" +
"\n" +
"---\n" +
"spring:\n" +
" profiles: alpha\n" +
"test1:\n" +
" config: alpha\n" +
"\n" +
"---\n" +
"spring:\n" +
" profiles: beta\n" +
"test1:\n" +
" config: beta";
Assert.assertEquals(environment.getActiveProfiles()[0], "alpha");
Object result = ConfigParseUtils.toProperties("test.yaml", "test", content, "yaml")
.get("test1.config");
Assert.assertEquals("alpha", result);
}
@Test
public void oneProfiles_when_content_profiles_isnull() {
String content = "test1:\n" +
" config: 2\n" +
"\n" +
"---\n" +
"test1:\n" +
" config: alpha\n" +
"\n" +
"---\n" +
"test1:\n" +
" config: beta";
Object result = ConfigParseUtils.toProperties("test.yaml", "test", content, "yaml")
.get("test1.config");
Assert.assertEquals("beta", result);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({"alpha", "beta"})
@SpringBootTest(classes = {NacosConfigAutoConfiguration.class})
public static class TwoProfiles {
@Autowired
private Environment environment;
@Before
public void setUp() {
MultiProfilesYamlConfigParseSupport.setProfileArray(environment.getActiveProfiles());
}
@Test
public void twoProfiles_normal() {
String content = "test1:\n" +
" config: 2\n" +
"\n" +
"---\n" +
"spring:\n" +
" profiles: alpha\n" +
"test1:\n" +
" config: alpha\n" +
"\n" +
"---\n" +
"spring:\n" +
" profiles: beta\n" +
"test1:\n" +
" config: beta";
Assert.assertEquals(environment.getActiveProfiles()[0], "alpha");
Assert.assertEquals(environment.getActiveProfiles()[1], "beta");
Object result = ConfigParseUtils.toProperties("test.yaml", "test", content, "yaml")
.get("test1.config");
Assert.assertEquals("beta", result);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {NacosConfigAutoConfiguration.class})
public static class NoProfiles {
@Autowired
private Environment environment;
@Test
public void noProfiles_normal() {
String content = "test1:\n" +
" config: 2\n" +
"\n" +
"---\n" +
"spring:\n" +
" profiles: default\n" +
"test1:\n" +
" config: default\n" +
"\n" +
"---\n" +
"spring:\n" +
" profiles: beta\n" +
"test1:\n" +
" config: beta";
Assert.assertEquals(environment.getActiveProfiles().length, 0);
Object result = ConfigParseUtils.toProperties("test.yaml", "test", content, "yaml")
.get("test1.config");
Assert.assertEquals("default", result);
}
}
}

View File

@ -1,59 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.logging;
import com.alibaba.boot.nacos.config.logging.NacosLoggingListener;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.core.ResolvableType;
import java.lang.reflect.Type;
/**
* {@link NacosLoggingListener} Test
* @ClassName: AttributeExtractTaskTest
* @Author: ChenHao26
* @Date: 2022/8/12 15:08
*/
public class NacosLoggingListenerTest {
private NacosLoggingListener nacosLoggingListener;
@Before
public void setup() {
nacosLoggingListener = new NacosLoggingListener();
}
@Test
public void supportsEventType() {
boolean result = nacosLoggingListener.supportsEventType(ResolvableType.forType(new Type() {
@Override
public String getTypeName() {
return Type.super.getTypeName();
}
}));
Assert.assertEquals(result, false);
}
@Test
public void getOrder() {
int order = nacosLoggingListener.getOrder();
Assert.assertNotNull(order);
}
}

View File

@ -1,65 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.util;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
import com.alibaba.boot.nacos.config.util.AttributeExtractTask;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySources;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Map;
/**
* {@link AttributeExtractTask} Test
* @ClassName: AttributeExtractTaskTest
* @Author: ChenHao26
* @Date: 2022/8/12 15:08
*/
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = { "nacos.config.server-addr=localhost" })
@SpringBootTest(classes = { NacosConfigAutoConfiguration.class })
public class AttributeExtractTaskTest {
private AttributeExtractTask attributeExtractTask;
@Autowired
private ConfigurableEnvironment environment ;
@Before
public void setUp() {
environment.setDefaultProfiles("prefix01");
attributeExtractTask = new AttributeExtractTask("nacos.config",environment);
}
@Test
public void call() throws Exception{
Map<String, String> map = attributeExtractTask.call();
Assert.assertEquals(map.get("nacos.config.server-addr"), "localhost");
}
}

View File

@ -1,87 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.util;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.boot.nacos.config.util.NacosConfigLoader;
import com.alibaba.boot.nacos.config.util.NacosConfigLoaderFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.client.config.NacosConfigService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Properties;
import java.util.function.Function;
/**
* @ClassName: NacosConfigLoaderFactoryTest
* @Author: ChenHao26
* @Date: 2022/8/12 16:42
*/
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = { "nacos.config.server-addr=localhost" })
@SpringBootTest(classes = { NacosConfigAutoConfiguration.class })
public class NacosConfigLoaderFactoryTest {
private NacosConfigProperties nacosConfigProperties;
private Properties globalProperties;
private Function<Properties, ConfigService> builder;
@Before
public void setup() {
nacosConfigProperties = new NacosConfigProperties();
nacosConfigProperties.setServerAddr("localhost");
nacosConfigProperties.setUsername("nacos");
nacosConfigProperties.setPassword("nacos");
nacosConfigProperties.setMaxRetry("4");
nacosConfigProperties.setType(ConfigType.TEXT);
nacosConfigProperties.setDataId("xiaomi");
nacosConfigProperties.setGroup("group01");
nacosConfigProperties.setAutoRefresh(true);
nacosConfigProperties.setEndpoint("localhost");
globalProperties = new Properties();
globalProperties.setProperty("maxRetry","3");
globalProperties.setProperty("content","key=01");
globalProperties.setProperty("endpoint","localhost");
builder = properties -> {
try {
return new NacosConfigService(globalProperties);
} catch (NacosException e) {
throw new RuntimeException(e);
}
};
}
@Test
public void getSingleton() {
NacosConfigLoader singleton = NacosConfigLoaderFactory.getSingleton(builder);
NacosConfigLoader singleton2 = NacosConfigLoaderFactory.getSingleton(builder);
// Verify that it is the same object
Assert.assertEquals(singleton2, singleton);
}
}

View File

@ -1,116 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.util;
import com.alibaba.boot.nacos.autoconfigure.NacosConfigEnvironmentProcessorTest;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.boot.nacos.config.util.NacosConfigLoader;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.client.config.NacosConfigService;
import com.alibaba.nacos.client.utils.LogUtils;
import com.alibaba.nacos.spring.core.env.NacosPropertySourcePostProcessor;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import java.util.function.Function;
/**
* @ClassName: NacosConfigLoaderTest
* @Author: ChenHao26
* @Date: 2022/8/12 16:12
*/
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = { "nacos.config.server-addr=localhost" })
@SpringBootTest(classes = { NacosConfigAutoConfiguration.class })
public class NacosConfigLoaderTest {
private NacosConfigLoader nacosConfigLoader;
private NacosConfigProperties nacosConfigProperties;
private Properties globalProperties;
@Autowired
private ConfigurableEnvironment environment;
private Function<Properties, ConfigService> builder;
private List<NacosConfigLoader.DeferNacosPropertySource> nacosPropertySources;
private static final Logger LOGGER = LogUtils.logger(NacosConfigEnvironmentProcessorTest.class);
private NacosPropertySourcePostProcessor nacosPropertySourcePostProcessor;
@Before
public void setup() {
nacosConfigProperties = new NacosConfigProperties();
nacosConfigProperties.setServerAddr("localhost");
nacosConfigProperties.setUsername("nacos");
nacosConfigProperties.setPassword("nacos");
nacosConfigProperties.setMaxRetry("4");
nacosConfigProperties.setType(ConfigType.TEXT);
nacosConfigProperties.setDataId("xiaomi");
nacosConfigProperties.setGroup("group01");
nacosConfigProperties.setAutoRefresh(true);
nacosConfigProperties.setEndpoint("localhost");
globalProperties = new Properties();
globalProperties.setProperty("maxRetry","3");
globalProperties.setProperty("content","key=01");
globalProperties.setProperty("endpoint","localhost");
builder = properties -> {
try {
return new NacosConfigService(globalProperties);
} catch (NacosException e) {
throw new RuntimeException(e);
}
};
nacosPropertySources = new LinkedList<>();
nacosConfigLoader = new NacosConfigLoader(builder);
nacosPropertySourcePostProcessor = new NacosPropertySourcePostProcessor();
}
@Test
public void buildGlobalNacosProperties() {
Properties properties = nacosConfigLoader.buildGlobalNacosProperties(environment, nacosConfigProperties);
LOGGER.info("buildGlobalNacosProperties properties : {}", properties);
Assert.assertNotNull(properties);
Assert.assertEquals(properties.size(), 6);
}
@Test
public void addListenerIfAutoRefreshed() {
nacosConfigLoader.addListenerIfAutoRefreshed();
List<NacosConfigLoader.DeferNacosPropertySource> propertySources = nacosConfigLoader.getNacosPropertySources();
Assert.assertEquals(propertySources.size(), 0);
}
}

View File

@ -1,56 +0,0 @@
/*
*
* * Licensed to the Apache Software Foundation (ASF) under one or more
* * contributor license agreements. See the NOTICE file distributed with
* * this work for additional information regarding copyright ownership.
* * The ASF licenses this file to You under the Apache License, Version 2.0
* * (the "License"); you may not use this file except in compliance with
* * the License. You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package com.alibaba.boot.nacos.util;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
import com.alibaba.boot.nacos.config.properties.NacosConfigProperties;
import com.alibaba.boot.nacos.config.util.NacosConfigPropertiesUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* {@link NacosConfigPropertiesUtils} Test
* @ClassName: NacosConfigPropertiesUtilsTest
* @Author: SuperZ1999
* @Date: 2023/9/28
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { NacosConfigAutoConfiguration.class })
@TestPropertySource(properties = {
"nacos.config.server-addr=8.8.8.8",
"nacos.config.password=123456"
})
public class NacosConfigPropertiesUtilsTest {
@Autowired
private ConfigurableEnvironment environment;
@Test
public void testBuildNacosConfigProperties() {
NacosConfigProperties properties = NacosConfigPropertiesUtils.buildNacosConfigProperties(environment);
Assert.assertEquals(properties.getServerAddr(), "8.8.8.8");
Assert.assertEquals(properties.getPassword(), "123456");
}
}

View File

@ -1,78 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.util;
import com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration;
import com.alibaba.boot.nacos.config.util.NacosPropertiesBuilder;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.Environment;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Properties;
/**
* @ClassName: NacosPropertiesBuilderTest
* @Author: ChenHao26
* @Date: 2022/8/12 16:49
*/
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = { "nacos.config.server-addr=localhost" })
@SpringBootTest(classes = { NacosConfigAutoConfiguration.class })
public class NacosPropertiesBuilderTest {
@Autowired
private Environment environment;
@Test
public void testBuildNacosProperties() {
String serverAddr = "${nacos.config.server-addr}";
String namespaceId = "namespaceId";
String secretKey = "secretKey";
String ramRoleName = "ramRoleName";
String configLongPollTimeout = "configLongPollTimeout";
String configRetryTimeout = "configRetryTimeout";
String maxRetry = "maxRetry";
String enableRemoteSyncConfig = "enableRemoteSyncConfig";
String username = "nacos";
String password = "password";
Properties properties = NacosPropertiesBuilder.buildNacosProperties(environment, serverAddr, namespaceId, secretKey,
"ak", ramRoleName, configLongPollTimeout, configRetryTimeout, maxRetry, null,enableRemoteSyncConfig, true,
username, password);
Assert.assertEquals(properties.size(), 12);
Assert.assertEquals(properties.get("serverAddr"), "localhost");
}
@Test
public void testMerge() {
Properties sourceProperties = new Properties();
sourceProperties.put("name", "SuperZ1999");
sourceProperties.put("age", 24);
Properties targetProperties = new Properties();
targetProperties.put("age", 99);
NacosPropertiesBuilder.merge(targetProperties, sourceProperties);
Assert.assertEquals(targetProperties.get("name"), "SuperZ1999");
Assert.assertEquals(targetProperties.get("age"), 99);
}
}

View File

@ -1,51 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.util.editor;
import com.alibaba.boot.nacos.config.util.editor.NacosCharSequenceEditor;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* @ClassName: NacosCharSequenceEditorTest
* @Author: ChenHao26
* @Date: 2022/8/12 17:00
*/
public class NacosCharSequenceEditorTest {
public NacosCharSequenceEditor nacosCharSequenceEditor;
@Before
public void setup() {
nacosCharSequenceEditor = new NacosCharSequenceEditor();
}
@Test
public void setValue() {
nacosCharSequenceEditor.setValue("nacosTest");
String asText = nacosCharSequenceEditor.getAsText();
Assert.assertEquals(asText,"nacosTest");
}
@Test
public void getAsText() {
String str = nacosCharSequenceEditor.getAsText();
Assert.assertEquals(str, "null");
}
}

View File

@ -1,64 +0,0 @@
/*
*
* * Licensed to the Apache Software Foundation (ASF) under one or more
* * contributor license agreements. See the NOTICE file distributed with
* * this work for additional information regarding copyright ownership.
* * The ASF licenses this file to You under the Apache License, Version 2.0
* * (the "License"); you may not use this file except in compliance with
* * the License. You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package com.alibaba.boot.nacos.util.editor;
import com.alibaba.boot.nacos.config.util.editor.NacosCustomBooleanEditor;
import org.junit.Assert;
import org.junit.Test;
/**
* {@link NacosCustomBooleanEditor} Test
* @ClassName: NacosCustomBooleanEditorTest
* @Author: SuperZ1999
* @Date: 2023/9/28
*/
public class NacosCustomBooleanEditorTest {
@Test
public void testAllowEmpty() {
NacosCustomBooleanEditor booleanEditor = new NacosCustomBooleanEditor(true);
booleanEditor.setValue("");
Assert.assertEquals(booleanEditor.getAsText(), "false");
booleanEditor.setValue("true");
Assert.assertEquals(booleanEditor.getAsText(), "true");
}
@Test(expected = IllegalArgumentException.class)
public void testNotAllowEmpty() {
NacosCustomBooleanEditor booleanEditor = new NacosCustomBooleanEditor(false);
booleanEditor.setValue("true");
Assert.assertEquals(booleanEditor.getAsText(), "true");
booleanEditor.setValue("");
}
@Test
public void testCustomBooleanString() {
NacosCustomBooleanEditor booleanEditor = new NacosCustomBooleanEditor("TRUE", "FALSE", true);
booleanEditor.setValue("");
Assert.assertEquals(booleanEditor.getAsText(), "FALSE");
booleanEditor.setValue("TRUE");
Assert.assertEquals(booleanEditor.getAsText(), "TRUE");
booleanEditor.setValue("false");
Assert.assertEquals(booleanEditor.getAsText(), "FALSE");
}
}

View File

@ -18,7 +18,7 @@
<parent> <parent>
<groupId>com.alibaba.boot</groupId> <groupId>com.alibaba.boot</groupId>
<artifactId>nacos-spring-boot-parent</artifactId> <artifactId>nacos-spring-boot-parent</artifactId>
<version>${revision}</version> <version>0.1.2</version>
<relativePath>../nacos-spring-boot-parent</relativePath> <relativePath>../nacos-spring-boot-parent</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -34,24 +34,13 @@
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId> <artifactId>spring-boot-starter</artifactId>
<scope>true</scope>
</dependency> </dependency>
<!-- Nacos --> <!-- Nacos -->
<dependency> <dependency>
<groupId>com.alibaba.nacos</groupId> <groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId> <artifactId>nacos-spring-context</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
</dependency> </dependency>
<dependency> <dependency>
@ -64,10 +53,5 @@
<artifactId>nacos-spring-boot-base</artifactId> <artifactId>nacos-spring-boot-base</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-spring-boot-aot</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -18,7 +18,7 @@
<parent> <parent>
<artifactId>nacos-spring-boot-parent</artifactId> <artifactId>nacos-spring-boot-parent</artifactId>
<groupId>com.alibaba.boot</groupId> <groupId>com.alibaba.boot</groupId>
<version>${revision}</version> <version>0.1.2</version>
<relativePath>../nacos-spring-boot-parent/pom.xml</relativePath> <relativePath>../nacos-spring-boot-parent/pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -81,20 +81,7 @@
<groupId>com.alibaba.nacos</groupId> <groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId> <artifactId>nacos-spring-context</artifactId>
<optional>true</optional> <optional>true</optional>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
</dependency>
<!-- Test Dependencies --> <!-- Test Dependencies -->
<dependency> <dependency>

View File

@ -16,13 +16,16 @@
*/ */
package com.alibaba.boot.nacos.discovery.actuate.autoconfigure; package com.alibaba.boot.nacos.discovery.actuate.autoconfigure;
import com.alibaba.boot.nacos.discovery.actuate.endpoint.NacosDiscoveryEndpoint; import org.springframework.boot.actuate.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import com.alibaba.boot.nacos.discovery.NacosDiscoveryConstants;
import com.alibaba.boot.nacos.discovery.actuate.endpoint.NacosDiscoveryEndpoint;
/** /**
* Nacos Discovery {@link Endpoint} Auto-{@link Configuration} * Nacos Discovery {@link Endpoint} Auto-{@link Configuration}
* *
@ -30,11 +33,12 @@ import org.springframework.context.annotation.Configuration;
* @see Endpoint * @see Endpoint
*/ */
@Configuration @Configuration
@ConditionalOnClass(Endpoint.class)
public class NacosDiscoveryEndpointsAutoConfiguration { public class NacosDiscoveryEndpointsAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
@ConditionalOnAvailableEndpoint @ConditionalOnEnabledEndpoint(NacosDiscoveryConstants.ENDPOINT_PREFIX)
public NacosDiscoveryEndpoint nacosDiscoveryEndpoint() { public NacosDiscoveryEndpoint nacosDiscoveryEndpoint() {
return new NacosDiscoveryEndpoint(); return new NacosDiscoveryEndpoint();
} }

View File

@ -16,12 +16,8 @@
*/ */
package com.alibaba.boot.nacos.discovery.actuate.autoconfigure; package com.alibaba.boot.nacos.discovery.actuate.autoconfigure;
import com.alibaba.boot.nacos.discovery.NacosDiscoveryConstants; import org.springframework.boot.actuate.autoconfigure.ConditionalOnEnabledHealthIndicator;
import com.alibaba.boot.nacos.discovery.actuate.health.NacosDiscoveryHealthIndicator; import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration;
import com.alibaba.boot.nacos.discovery.autoconfigure.NacosDiscoveryAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator;
import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.AutoConfigureBefore;
@ -30,6 +26,10 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import com.alibaba.boot.nacos.discovery.NacosDiscoveryConstants;
import com.alibaba.boot.nacos.discovery.actuate.health.NacosDiscoveryHealthIndicator;
import com.alibaba.boot.nacos.discovery.autoconfigure.NacosDiscoveryAutoConfiguration;
/** /**
* Nacos {@link NacosDiscoveryHealthIndicator} Auto Configuration * Nacos {@link NacosDiscoveryHealthIndicator} Auto Configuration
* *

View File

@ -16,64 +16,66 @@
*/ */
package com.alibaba.boot.nacos.discovery.actuate.endpoint; package com.alibaba.boot.nacos.discovery.actuate.endpoint;
import static com.alibaba.nacos.spring.util.NacosBeanUtils.DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.AbstractEndpoint;
import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.context.ApplicationContext;
import com.alibaba.boot.nacos.common.PropertiesUtils; import com.alibaba.boot.nacos.common.PropertiesUtils;
import com.alibaba.boot.nacos.discovery.NacosDiscoveryConstants; import com.alibaba.boot.nacos.discovery.NacosDiscoveryConstants;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.alibaba.nacos.spring.factory.CacheableEventPublishingNacosServiceFactory; import com.alibaba.nacos.spring.factory.CacheableEventPublishingNacosServiceFactory;
import com.alibaba.nacos.spring.factory.NacosServiceFactory; import com.alibaba.nacos.spring.factory.NacosServiceFactory;
import com.alibaba.nacos.spring.util.NacosUtils; import com.alibaba.nacos.spring.util.NacosUtils;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.context.ApplicationContext;
import static com.alibaba.nacos.spring.util.NacosBeanUtils.DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME;
/** /**
* Actuator {@link Endpoint} to expose Nacos Discovery Meta Data * Actuator {@link Endpoint} to expose Nacos Discovery Meta Data
* *
* @author <a href="mailto:fangjian0423@gmail.com">Jim</a> * @author <a href="mailto:fangjian0423@gmail.com">Jim</a>
* @see Endpoint * @see Endpoint
*/ */
@Endpoint(id = NacosDiscoveryConstants.ENDPOINT_PREFIX) public class NacosDiscoveryEndpoint extends AbstractEndpoint<Map<String, Object>> {
public class NacosDiscoveryEndpoint {
@Autowired @Autowired
private ApplicationContext applicationContext; private ApplicationContext applicationContext;
private static final Integer PAGE_SIZE = 100; private static final Integer PAGE_SIZE = 100;
@ReadOperation public NacosDiscoveryEndpoint() {
super(NacosDiscoveryConstants.ENDPOINT_PREFIX);
}
@Override
public Map<String, Object> invoke() { public Map<String, Object> invoke() {
Map<String, Object> result = new HashMap<>(8); Map<String, Object> result = new HashMap<>();
result.put("nacosDiscoveryGlobalProperties", result.put("nacosDiscoveryGlobalProperties",
PropertiesUtils.extractSafeProperties(applicationContext.getBean( PropertiesUtils.extractSafeProperties(applicationContext.getBean(
DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME, Properties.class))); DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME, Properties.class)));
NacosServiceFactory nacosServiceFactory = CacheableEventPublishingNacosServiceFactory NacosServiceFactory nacosServiceFactory = CacheableEventPublishingNacosServiceFactory.getSingleton();;
.getSingleton();
ArrayNode array = JacksonUtils.createEmptyArrayNode(); JSONArray array = new JSONArray();
for (NamingService namingService : nacosServiceFactory.getNamingServices()) { for (NamingService namingService : nacosServiceFactory.getNamingServices()) {
ObjectNode jsonObject = JacksonUtils.createEmptyJsonNode(); JSONObject jsonObject = new JSONObject();
try { try {
jsonObject.putPOJO("servicesOfServer", jsonObject.put("servicesOfServer",
namingService.getServicesOfServer(0, PAGE_SIZE)); namingService.getServicesOfServer(0, PAGE_SIZE));
jsonObject.putPOJO("subscribeServices", namingService.getSubscribeServices()); jsonObject.put("subscribeServices", namingService.getSubscribeServices());
array.add(jsonObject); array.add(jsonObject);
} }
catch (Exception e) { catch (NacosException e) {
jsonObject.put("serverStatus", namingService.getServerStatus() + ": " jsonObject.put("serverStatus", namingService.getServerStatus() + ": "
+ NacosUtils.SEPARATOR + e.getMessage()); + e.getErrCode() + NacosUtils.SEPARATOR + e.getErrMsg());
} }
} }

View File

@ -18,19 +18,19 @@ package com.alibaba.boot.nacos.discovery.actuate.health;
import java.util.Properties; import java.util.Properties;
import com.alibaba.boot.nacos.common.PropertiesUtils;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.alibaba.nacos.spring.factory.CacheableEventPublishingNacosServiceFactory;
import com.alibaba.nacos.spring.factory.NacosServiceFactory; import com.alibaba.nacos.spring.factory.NacosServiceFactory;
import com.alibaba.nacos.spring.metadata.NacosServiceMetaData;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import com.alibaba.boot.nacos.common.PropertiesUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.spring.factory.CacheableEventPublishingNacosServiceFactory;
import com.alibaba.nacos.spring.metadata.NacosServiceMetaData;
/** /**
* Nacos Discovery {@link HealthIndicator} * Nacos Discovery {@link HealthIndicator}
* *
@ -47,18 +47,17 @@ public class NacosDiscoveryHealthIndicator extends AbstractHealthIndicator {
@Override @Override
protected void doHealthCheck(Health.Builder builder) throws Exception { protected void doHealthCheck(Health.Builder builder) throws Exception {
builder.up(); builder.up();
NacosServiceFactory nacosServiceFactory = CacheableEventPublishingNacosServiceFactory NacosServiceFactory nacosServiceFactory = CacheableEventPublishingNacosServiceFactory.getSingleton();
.getSingleton();
for (NamingService namingService : nacosServiceFactory.getNamingServices()) { for (NamingService namingService : nacosServiceFactory.getNamingServices()) {
if (namingService instanceof NacosServiceMetaData) { if (namingService instanceof NacosServiceMetaData) {
NacosServiceMetaData nacosServiceMetaData = (NacosServiceMetaData) namingService; NacosServiceMetaData nacosServiceMetaData = (NacosServiceMetaData) namingService;
Properties properties = nacosServiceMetaData.getProperties(); Properties properties = nacosServiceMetaData.getProperties();
builder.withDetail( builder.withDetail(
JacksonUtils.toJson( JSON.toJSONString(
PropertiesUtils.extractSafeProperties(properties)), PropertiesUtils.extractSafeProperties(properties)),
namingService.getServerStatus()); namingService.getServerStatus());
} }
if (!namingService.getServerStatus().equalsIgnoreCase(UP_STATUS)) { if (!namingService.getServerStatus().toLowerCase().equals(UP_STATUS)) {
builder.down(); builder.down();
} }
} }

View File

@ -1,2 +0,0 @@
com.alibaba.boot.nacos.discovery.actuate.autoconfigure.NacosDiscoveryEndpointsAutoConfiguration
com.alibaba.boot.nacos.discovery.actuate.autoconfigure.NacosDiscoveryHealthIndicatorAutoConfiguration

View File

@ -1,52 +0,0 @@
/*
*
* * Licensed to the Apache Software Foundation (ASF) under one or more
* * contributor license agreements. See the NOTICE file distributed with
* * this work for additional information regarding copyright ownership.
* * The ASF licenses this file to You under the Apache License, Version 2.0
* * (the "License"); you may not use this file except in compliance with
* * the License. You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package com.alibaba.boot.nacos.actuate.autoconfigure;
import com.alibaba.boot.nacos.discovery.actuate.autoconfigure.NacosDiscoveryEndpointsAutoConfiguration;
import com.alibaba.boot.nacos.discovery.actuate.endpoint.NacosDiscoveryEndpoint;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* {@link NacosDiscoveryEndpointsAutoConfiguration} Test
* @ClassName: NacosDiscoveryEndpointsAutoConfigurationTest
* @Author: SuperZ1999
* @Date: 2023/9/28
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {NacosDiscoveryEndpointsAutoConfiguration.class})
@TestPropertySource(properties = {
"management.endpoints.web.exposure.include=nacos-discovery"
})
public class NacosDiscoveryEndpointsAutoConfigurationTest {
@Autowired
private ApplicationContext context;
@Test
public void testNacosDiscoveryEndpointBean() {
Assert.assertNotNull(context.getBean(NacosDiscoveryEndpoint.class));
}
}

View File

@ -1,48 +0,0 @@
/*
*
* * Licensed to the Apache Software Foundation (ASF) under one or more
* * contributor license agreements. See the NOTICE file distributed with
* * this work for additional information regarding copyright ownership.
* * The ASF licenses this file to You under the Apache License, Version 2.0
* * (the "License"); you may not use this file except in compliance with
* * the License. You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package com.alibaba.boot.nacos.actuate.autoconfigure;
import com.alibaba.boot.nacos.discovery.actuate.autoconfigure.NacosDiscoveryHealthIndicatorAutoConfiguration;
import com.alibaba.boot.nacos.discovery.actuate.health.NacosDiscoveryHealthIndicator;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* {@link NacosDiscoveryHealthIndicatorAutoConfiguration} Test
* @ClassName: NacosDiscoveryHealthIndicatorAutoConfigurationTest
* @Author: SuperZ1999
* @Date: 2023/9/28
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {NacosDiscoveryHealthIndicatorAutoConfiguration.class})
public class NacosDiscoveryHealthIndicatorAutoConfigurationTest {
@Autowired
private ApplicationContext context;
@Test
public void testNacosConfigHealthIndicatorBean() {
Assert.assertNotNull(context.getBean(NacosDiscoveryHealthIndicator.class));
}
}

View File

@ -19,16 +19,18 @@ package com.alibaba.boot.nacos.actuate.endpoint;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import com.alibaba.boot.nacos.discovery.actuate.endpoint.NacosDiscoveryEndpoint;
import com.alibaba.boot.nacos.discovery.autoconfigure.NacosDiscoveryAutoConfiguration;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import com.alibaba.boot.nacos.discovery.actuate.endpoint.NacosDiscoveryEndpoint;
import com.alibaba.boot.nacos.discovery.autoconfigure.NacosDiscoveryAutoConfiguration;
import com.alibaba.nacos.api.PropertyKeyConst;
/** /**
* {@link NacosDiscoveryEndpoint} Test * {@link NacosDiscoveryEndpoint} Test
* *
@ -36,6 +38,7 @@ import org.springframework.test.context.junit4.SpringRunner;
* @see NacosDiscoveryEndpoint * @see NacosDiscoveryEndpoint
*/ */
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@TestPropertySource(properties = { "nacos.discovery.server-addr=localhost" })
@SpringBootTest(classes = { NacosDiscoveryEndpoint.class, @SpringBootTest(classes = { NacosDiscoveryEndpoint.class,
NacosDiscoveryAutoConfiguration.class }) NacosDiscoveryAutoConfiguration.class })
public class NacosDiscoveryEndpointTest { public class NacosDiscoveryEndpointTest {
@ -50,7 +53,8 @@ public class NacosDiscoveryEndpointTest {
HashMap nacosDiscoveryGlobalProperties = (HashMap) metadata HashMap nacosDiscoveryGlobalProperties = (HashMap) metadata
.get("nacosDiscoveryGlobalProperties"); .get("nacosDiscoveryGlobalProperties");
Assert.assertNotNull(nacosDiscoveryGlobalProperties); Assert.assertEquals("localhost",
nacosDiscoveryGlobalProperties.get(PropertyKeyConst.SERVER_ADDR));
} }
} }

View File

@ -1 +0,0 @@
nacos.discovery.serverAddr = "127.0.0.1:8848"

View File

@ -18,7 +18,7 @@
<parent> <parent>
<groupId>com.alibaba.boot</groupId> <groupId>com.alibaba.boot</groupId>
<artifactId>nacos-spring-boot-parent</artifactId> <artifactId>nacos-spring-boot-parent</artifactId>
<version>${revision}</version> <version>0.1.2</version>
<relativePath>../nacos-spring-boot-parent</relativePath> <relativePath>../nacos-spring-boot-parent</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -54,30 +54,11 @@
<groupId>com.alibaba.nacos</groupId> <groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId> <artifactId>nacos-spring-context</artifactId>
<optional>true</optional> <optional>true</optional>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-spring-boot-base</artifactId>
<optional>true</optional>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.alibaba.boot</groupId> <groupId>com.alibaba.boot</groupId>
<artifactId>nacos-spring-boot-aot</artifactId> <artifactId>nacos-spring-boot-base</artifactId>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>

View File

@ -25,10 +25,9 @@ import com.alibaba.nacos.spring.context.annotation.discovery.EnableNacosDiscover
*/ */
public interface NacosDiscoveryConstants { public interface NacosDiscoveryConstants {
String PREFIX = "nacos.discovery"; String ENDPOINT_PREFIX = "nacos_discovery";
String ENDPOINT_PREFIX = "nacos-discovery"; String ENABLED = EnableNacosDiscovery.DISCOVERY_PREFIX + "enabled";
String ENABLED = EnableNacosDiscovery.DISCOVERY_PREFIX + "enabled";
String PREFIX = "nacos.discovery";
} }

View File

@ -1,32 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.discovery.autoconfigure;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.4
*/
public class AutoDeregisterException extends RuntimeException {
public AutoDeregisterException(String message) {
super(message);
}
public AutoDeregisterException(Throwable cause) {
super(cause);
}
}

View File

@ -1,32 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.discovery.autoconfigure;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.3
*/
public class AutoRegisterException extends RuntimeException {
public AutoRegisterException(String message) {
super(message);
}
public AutoRegisterException(Throwable cause) {
super(cause);
}
}

View File

@ -16,18 +16,16 @@
*/ */
package com.alibaba.boot.nacos.discovery.autoconfigure; package com.alibaba.boot.nacos.discovery.autoconfigure;
import com.alibaba.boot.nacos.aot.context.EnableNacosDiscoveryAotProcessor;
import com.alibaba.boot.nacos.discovery.NacosDiscoveryConstants;
import com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties;
import com.alibaba.nacos.spring.context.annotation.discovery.EnableNacosDiscovery; import com.alibaba.nacos.spring.context.annotation.discovery.EnableNacosDiscovery;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import com.alibaba.boot.nacos.discovery.NacosDiscoveryConstants;
import com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties;
import static com.alibaba.nacos.spring.util.NacosBeanUtils.DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME; import static com.alibaba.nacos.spring.util.NacosBeanUtils.DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME;
@ -40,13 +38,7 @@ import static com.alibaba.nacos.spring.util.NacosBeanUtils.DISCOVERY_GLOBAL_NACO
@ConditionalOnMissingBean(name = DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME) @ConditionalOnMissingBean(name = DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME)
@EnableNacosDiscovery @EnableNacosDiscovery
@EnableConfigurationProperties(value = NacosDiscoveryProperties.class) @EnableConfigurationProperties(value = NacosDiscoveryProperties.class)
@ConditionalOnClass(name = "org.springframework.boot.context.properties.bind.Binder") @ConditionalOnClass(name = "org.springframework.boot.bind.RelaxedDataBinder")
@Import(EnableNacosDiscoveryAotProcessor.class)
public class NacosDiscoveryAutoConfiguration { public class NacosDiscoveryAutoConfiguration {
@Bean
public NacosDiscoveryAutoRegister discoveryAutoRegister() {
return new NacosDiscoveryAutoRegister();
}
} }

View File

@ -1,96 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.discovery.autoconfigure;
import com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties;
import com.alibaba.boot.nacos.discovery.properties.Register;
import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.utils.NetUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.server.WebServer;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.4
*/
@Component
public class NacosDiscoveryAutoDeregister
implements ApplicationListener<ContextClosedEvent> {
private static final Logger logger = LoggerFactory
.getLogger(NacosDiscoveryAutoRegister.class);
@NacosInjected
private NamingService namingService;
private final NacosDiscoveryProperties discoveryProperties;
private final WebServer webServer;
@Value("${spring.application.name:}")
private String applicationName;
public NacosDiscoveryAutoDeregister(NacosDiscoveryProperties discoveryProperties,
WebServer webServer) {
this.discoveryProperties = discoveryProperties;
this.webServer = webServer;
}
@Override
public void onApplicationEvent(ContextClosedEvent event) {
if (!discoveryProperties.isAutoRegister()) {
return;
}
Register register = discoveryProperties.getRegister();
if (StringUtils.isEmpty(register.getIp())) {
register.setIp(NetUtils.localIP());
}
if (register.getPort() == 0) {
register.setPort(webServer.getPort());
}
String serviceName = register.getServiceName();
if (StringUtils.isEmpty(serviceName)){
if (StringUtils.isEmpty(applicationName)){
throw new AutoDeregisterException("serviceName notNull");
}
serviceName = applicationName;
}
try {
namingService.deregisterInstance(serviceName, register.getGroupName(),
register);
logger.info("Finished auto deregister service : {}, ip : {}, port : {}",
serviceName, register.getIp(), register.getPort());
}
catch (NacosException e) {
throw new AutoDeregisterException(e);
}
}
}

View File

@ -1,96 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.discovery.autoconfigure;
import com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties;
import com.alibaba.boot.nacos.discovery.properties.Register;
import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.utils.NetUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.3
*/
@Component
public class NacosDiscoveryAutoRegister
implements ApplicationListener<WebServerInitializedEvent> {
private static final Logger logger = LoggerFactory
.getLogger(NacosDiscoveryAutoRegister.class);
@NacosInjected
private NamingService namingService;
@Autowired
private NacosDiscoveryProperties discoveryProperties;
@Value("${spring.application.name:}")
private String applicationName;
@Override
public void onApplicationEvent(WebServerInitializedEvent event) {
if (!discoveryProperties.isAutoRegister()) {
return;
}
Register register = discoveryProperties.getRegister();
if (StringUtils.isEmpty(register.getIp())) {
register.setIp(NetUtils.localIP());
}
if (register.getPort() == 0) {
register.setPort(event.getWebServer().getPort());
}
register.getMetadata().put("preserved.register.source", "SPRING_BOOT");
register.setInstanceId("");
String serviceName = register.getServiceName();
if (StringUtils.isEmpty(serviceName)){
if (StringUtils.isEmpty(applicationName)){
throw new AutoRegisterException("serviceName notNull");
}
serviceName = applicationName;
}
try {
namingService.registerInstance(serviceName, register.getGroupName(),
register);
logger.info("Finished auto register service : {}, ip : {}, port : {}",
serviceName, register.getIp(), register.getPort());
} catch (NacosException e) {
throw new AutoRegisterException(e);
}
}
}

View File

@ -17,9 +17,7 @@
package com.alibaba.boot.nacos.discovery.properties; package com.alibaba.boot.nacos.discovery.properties;
import com.alibaba.boot.nacos.discovery.NacosDiscoveryConstants; import com.alibaba.boot.nacos.discovery.NacosDiscoveryConstants;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
@ -30,9 +28,9 @@ import org.springframework.util.Assert;
@ConfigurationProperties(NacosDiscoveryConstants.PREFIX) @ConfigurationProperties(NacosDiscoveryConstants.PREFIX)
public class NacosDiscoveryProperties { public class NacosDiscoveryProperties {
private String serverAddr = "127.0.0.1:8848"; private String serverAddr;
private String contextPath; private String contextPath;
private String clusterName; private String clusterName;
@ -44,101 +42,60 @@ public class NacosDiscoveryProperties {
private String secretKey; private String secretKey;
private boolean autoRegister = false; public String getServerAddr() {
return serverAddr;
}
@NestedConfigurationProperty public void setServerAddr(String serverAddr) {
private Register register = new Register(); Assert.notNull(serverAddr, "nacos discovery server-addr must not be null");
this.serverAddr = serverAddr;
}
private String username; public String getContextPath() {
return contextPath;
}
private String password; public void setContextPath(String contextPath) {
this.contextPath = contextPath;
}
public String getUsername() { public String getClusterName() {
return username; return clusterName;
} }
public void setUsername(String username) { public void setClusterName(String clusterName) {
this.username = username; this.clusterName = clusterName;
} }
public String getPassword() { public String getEndpoint() {
return password; return endpoint;
} }
public void setPassword(String password) { public void setEndpoint(String endpoint) {
this.password = password; this.endpoint = endpoint;
} }
public String getServerAddr() { public String getNamespace() {
return serverAddr; return namespace;
} }
public void setServerAddr(String serverAddr) { public void setNamespace(String namespace) {
Assert.notNull(serverAddr, "nacos discovery server-addr must not be null"); this.namespace = namespace;
this.serverAddr = serverAddr; }
}
public String getContextPath() { public String getAccessKey() {
return contextPath; return accessKey;
} }
public void setContextPath(String contextPath) { public void setAccessKey(String accessKey) {
this.contextPath = contextPath; this.accessKey = accessKey;
} }
public String getClusterName() { public String getSecretKey() {
return clusterName; return secretKey;
} }
public void setClusterName(String clusterName) { public void setSecretKey(String secretKey) {
this.clusterName = clusterName; this.secretKey = secretKey;
} }
public String getEndpoint() {
return endpoint;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
public String getNamespace() {
return namespace;
}
public void setNamespace(String namespace) {
this.namespace = namespace;
}
public String getAccessKey() {
return accessKey;
}
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
public boolean isAutoRegister() {
return autoRegister;
}
public void setAutoRegister(boolean autoRegister) {
this.autoRegister = autoRegister;
}
public Register getRegister() {
return register;
}
public void setRegister(Register register) {
this.register = register;
}
} }

View File

@ -1,37 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.boot.nacos.discovery.properties;
import com.alibaba.nacos.api.common.Constants;
import com.alibaba.nacos.api.naming.pojo.Instance;
/**
* @author <a href="mailto:liaochunyhm@live.com">liaochuntao</a>
* @since 0.2.3
*/
public class Register extends Instance {
private String groupName = Constants.DEFAULT_GROUP;
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
}

View File

@ -1,10 +0,0 @@
{
"groups": [
{
"sourceType": "com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties",
"name": "nacos.discovery.register",
"sourceMethod": "getInstance()",
"type": "com.alibaba.nacos.api.naming.pojo.Instance"
}
]
}

View File

@ -0,0 +1,54 @@
{
hints: [ ],
groups: [ ],
properties: [
{
sourceType: "com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties",
name: "nacos.discovery.enabled",
description: "enable or disable nacos discovery feature",
type: "java.lang.Boolean"
},
{
sourceType: "com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties",
name: "nacos.discovery.server-addr",
description: "the server address of nacos",
type: "java.lang.String"
},
{
sourceType: "com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties",
name: "nacos.discovery.context-path",
description: "the context path of nacos server",
type: "java.lang.String"
},
{
sourceType: "com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties",
name: "nacos.discovery.endpoint",
description: "the entry domain name of a service in each region",
type: "java.lang.String"
},
{
sourceType: "com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties",
name: "nacos.discovery.cluster-name",
description: "cluster info under service",
type: "java.lang.String"
},
{
sourceType: "com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties",
name: "nacos.discovery.namespace",
description: "for configuration isolation by tenants. Different namespaces may have configurations with the same Group or Data ID. ",
type: "java.lang.String"
},
{
sourceType: "com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties",
name: "nacos.discovery.access-key",
description: "the accesskey of Alibaba Cloud Account",
type: "java.lang.String"
},
{
sourceType: "com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties",
name: "nacos.discovery.secret-key",
description: "the secretkey of Alibaba Cloud Account",
type: "java.lang.String"
}
]
}

View File

@ -1,2 +1,2 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.alibaba.boot.nacos.discovery.autoconfigure.NacosDiscoveryAutoConfiguration com.alibaba.boot.nacos.discovery.autoconfigure.NacosDiscoveryAutoConfiguration

View File

@ -1 +0,0 @@
com.alibaba.boot.nacos.discovery.autoconfigure.NacosDiscoveryAutoConfiguration

View File

@ -19,16 +19,11 @@ package com.alibaba.boot.nacos.autoconfigure;
import java.util.Properties; import java.util.Properties;
import com.alibaba.boot.nacos.discovery.autoconfigure.NacosDiscoveryAutoConfiguration; import com.alibaba.boot.nacos.discovery.autoconfigure.NacosDiscoveryAutoConfiguration;
import com.alibaba.boot.nacos.discovery.autoconfigure.NacosDiscoveryAutoRegister;
import com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties; import com.alibaba.boot.nacos.discovery.properties.NacosDiscoveryProperties;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.spring.util.NacosBeanUtils;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
@ -36,6 +31,10 @@ import org.springframework.context.ApplicationContext;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.spring.util.NacosBeanUtils;
/** /**
* {@link NacosDiscoveryAutoConfiguration} Test * {@link NacosDiscoveryAutoConfiguration} Test
* *
@ -43,50 +42,46 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
* @see NacosDiscoveryAutoConfiguration * @see NacosDiscoveryAutoConfiguration
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = { "nacos.discovery.server-addr=localhost" }) @TestPropertySource(
@SpringBootTest(classes = { NacosDiscoveryAutoConfiguration.class }) properties = {
"nacos.discovery.server-addr=localhost"
}
)
@SpringBootTest(
classes = {NacosDiscoveryAutoConfiguration.class}
)
public class NacosDiscoveryAutoConfigurationTest { public class NacosDiscoveryAutoConfigurationTest {
@Autowired @Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties; private NacosDiscoveryProperties nacosDiscoveryProperties;
@Autowired @Autowired
private ApplicationContext applicationContext; private ApplicationContext applicationContext;
@NacosInjected @NacosInjected
private NamingService namingService; private NamingService namingService;
@Test @Test
public void testNacosDiscovery() { public void testNacosDiscovery() {
Assert.assertNotNull(namingService); Assert.assertNotNull(namingService);
Assert.assertNotNull(applicationContext Assert.assertNotNull(applicationContext.getBean(NacosBeanUtils.DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME));
.getBean(NacosBeanUtils.DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME)); Assert.assertEquals("localhost", nacosDiscoveryProperties.getServerAddr());
Assert.assertEquals("localhost", nacosDiscoveryProperties.getServerAddr()); }
}
@Test(expected = NoSuchBeanDefinitionException.class) @Test(expected = NoSuchBeanDefinitionException.class)
public void testNacosDiscoveryGlobalBean() { public void testNacosConfigGlobalBean() {
Assert.assertNull(applicationContext Assert.assertNull(applicationContext.getBean(NacosBeanUtils.GLOBAL_NACOS_PROPERTIES_BEAN_NAME));
.getBean(NacosBeanUtils.GLOBAL_NACOS_PROPERTIES_BEAN_NAME)); }
}
@Test(expected = NoSuchBeanDefinitionException.class) @Test(expected = NoSuchBeanDefinitionException.class)
public void testNacosConfigGlobalBean() { public void testNacosDiscoveryGlobalBean() {
Assert.assertNull(applicationContext Assert.assertNull(applicationContext.getBean(NacosBeanUtils.CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME));
.getBean(NacosBeanUtils.CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME)); }
}
@Test @Test
public void testNacosGlobalProperties() { public void testNacosGlobalProperties() {
Properties properties = applicationContext.getBean( Properties properties = applicationContext.getBean(NacosBeanUtils.DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME, Properties.class);
NacosBeanUtils.DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME, Assert.assertEquals("localhost", properties.getProperty(PropertyKeyConst.SERVER_ADDR));
Properties.class); }
Assert.assertEquals("localhost",
properties.getProperty(PropertyKeyConst.SERVER_ADDR));
}
@Test
public void testAddNacosDiscoveryAutoRegister() {
Assert.assertNotNull(applicationContext.getBean(NacosDiscoveryAutoRegister.class));
}
} }

View File

@ -18,7 +18,7 @@
<parent> <parent>
<groupId>com.alibaba.boot</groupId> <groupId>com.alibaba.boot</groupId>
<artifactId>nacos-spring-boot-parent</artifactId> <artifactId>nacos-spring-boot-parent</artifactId>
<version>${revision}</version> <version>0.1.2</version>
<relativePath>../nacos-spring-boot-parent</relativePath> <relativePath>../nacos-spring-boot-parent</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -34,24 +34,13 @@
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId> <artifactId>spring-boot-starter</artifactId>
<scope>true</scope>
</dependency> </dependency>
<!-- Nacos --> <!-- Nacos -->
<dependency> <dependency>
<groupId>com.alibaba.nacos</groupId> <groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId> <artifactId>nacos-spring-context</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
</dependency> </dependency>
<dependency> <dependency>
@ -64,10 +53,5 @@
<artifactId>nacos-spring-boot-base</artifactId> <artifactId>nacos-spring-boot-base</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-spring-boot-aot</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,69 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ /*
~ * Licensed to the Apache Software Foundation (ASF) under one or more
~ * contributor license agreements. See the NOTICE file distributed with
~ * this work for additional information regarding copyright ownership.
~ * The ASF licenses this file to You under the Apache License, Version 2.0
~ * (the "License"); you may not use this file except in compliance with
~ * the License. You may obtain a copy of the License at
~ *
~ * http://www.apache.org/licenses/LICENSE-2.0
~ *
~ * Unless required by applicable law or agreed to in writing, software
~ * distributed under the License is distributed on an "AS IS" BASIS,
~ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ * See the License for the specific language governing permissions and
~ * limitations under the License.
~ */
-->
<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>
<parent>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-spring-boot-parent</artifactId>
<version>${revision}</version>
<relativePath>../nacos-spring-boot-parent</relativePath>
</parent>
<artifactId>nacos-spring-boot-aot</artifactId>
<packaging>jar</packaging>
<name>Nacos Spring Boot Aot</name>
<description>Nacos Spring Boot Aot</description>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring6.framework.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring6.framework.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring6.framework.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId>
<version>${nacos-spring-context.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
</dependency>
</dependencies>
</project>

View File

@ -1,105 +0,0 @@
/*
*
* * Licensed to the Apache Software Foundation (ASF) under one or more
* * contributor license agreements. See the NOTICE file distributed with
* * this work for additional information regarding copyright ownership.
* * The ASF licenses this file to You under the Apache License, Version 2.0
* * (the "License"); you may not use this file except in compliance with
* * the License. You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package com.alibaba.boot.nacos.aot.context;
import com.alibaba.boot.nacos.aot.util.AotDetector;
import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
import com.alibaba.nacos.spring.context.annotation.config.NacosConfigBeanDefinitionRegistrar;
import com.alibaba.nacos.spring.core.env.NacosPropertySourcePostProcessor;
import com.alibaba.nacos.spring.util.NacosBeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotationMetadata;
import java.util.Map;
import static com.alibaba.nacos.spring.util.NacosBeanUtils.*;
/**
* {@link EnableNacosConfig} AotProcessor
* Except for the operation of registering BeanDefinition, all other operations in {@link NacosConfigBeanDefinitionRegistrar} must be done here
* because spring will not call {@link NacosConfigBeanDefinitionRegistrar#registerBeanDefinitions} in AOT.
* @author SuperZ1999
*/
public class EnableNacosConfigAotProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware, BeanFactoryAware {
private Environment environment;
private BeanFactory beanFactory;
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
if (!AotDetector.useGeneratedArtifacts()) {
return;
}
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) this.beanFactory;
Map<String, Object> beansWithAnnotation = beanFactory.getBeansWithAnnotation(EnableNacosConfig.class);
Object[] beans = beansWithAnnotation.values().toArray();
if (beans.length != 0) {
// only handle the first one
Class<?> aClass = beans[0].getClass();
if (aClass.getAnnotation(EnableNacosConfig.class) == null) {
// cglib proxy object
aClass = aClass.getSuperclass();
}
AnnotationMetadata annotationMetadata = AnnotationMetadata.introspect(aClass);
AnnotationAttributes attributes = AnnotationAttributes
.fromMap(annotationMetadata
.getAnnotationAttributes(EnableNacosConfig.class.getName()));
// Register Global Nacos Properties Bean
registerGlobalNacosProperties(attributes, registry, environment,
CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME);
}
registerNacosConfigListenerExecutor(registry, environment);
// replace NacosPropertySourcePostProcessor with NacosPropertySourcePostProcessorForAot
if (registry.containsBeanDefinition(NacosPropertySourcePostProcessor.BEAN_NAME)) {
registry.removeBeanDefinition(NacosPropertySourcePostProcessor.BEAN_NAME);
}
NacosBeanUtils.registerInfrastructureBeanIfAbsent(registry, NacosPropertySourcePostProcessorForAot.BEAN_NAME,
NacosPropertySourcePostProcessorForAot.class);
// Invoke NacosPropertySourcePostProcessor immediately
// in order to enhance the precedence of @NacosPropertySource process
invokeNacosPropertySourcePostProcessor(this.beanFactory);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
}

View File

@ -1,94 +0,0 @@
/*
*
* * Licensed to the Apache Software Foundation (ASF) under one or more
* * contributor license agreements. See the NOTICE file distributed with
* * this work for additional information regarding copyright ownership.
* * The ASF licenses this file to You under the Apache License, Version 2.0
* * (the "License"); you may not use this file except in compliance with
* * the License. You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package com.alibaba.boot.nacos.aot.context;
import com.alibaba.boot.nacos.aot.util.AotDetector;
import com.alibaba.nacos.spring.context.annotation.discovery.EnableNacosDiscovery;
import com.alibaba.nacos.spring.context.annotation.discovery.NacosDiscoveryBeanDefinitionRegistrar;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotationMetadata;
import java.util.Map;
import static com.alibaba.nacos.spring.util.NacosBeanUtils.*;
/**
* {@link EnableNacosDiscovery} AotProcessor
* Except for the operation of registering BeanDefinition, all other operations in {@link NacosDiscoveryBeanDefinitionRegistrar} must be done here
* because spring will not call {@link NacosDiscoveryBeanDefinitionRegistrar#registerBeanDefinitions} in AOT.
* @author SuperZ1999
*/
public class EnableNacosDiscoveryAotProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware, BeanFactoryAware {
private Environment environment;
private BeanFactory beanFactory;
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
if (!AotDetector.useGeneratedArtifacts()) {
return;
}
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) this.beanFactory;
Map<String, Object> beansWithAnnotation = beanFactory.getBeansWithAnnotation(EnableNacosDiscovery.class);
Object[] beans = beansWithAnnotation.values().toArray();
if (beans.length != 0) {
// only handle the first one
Class<?> aClass = beans[0].getClass();
if (aClass.getAnnotation(EnableNacosDiscovery.class) == null) {
// cglib proxy object
aClass = aClass.getSuperclass();
}
AnnotationMetadata annotationMetadata = AnnotationMetadata.introspect(aClass);
AnnotationAttributes attributes = AnnotationAttributes
.fromMap(annotationMetadata
.getAnnotationAttributes(EnableNacosDiscovery.class.getName()));
// Register Global Nacos Properties Bean
registerGlobalNacosProperties(attributes, registry, environment,
DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME);
registerGlobalNacosProperties(attributes, registry, environment,
MAINTAIN_GLOBAL_NACOS_PROPERTIES_BEAN_NAME);
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
}

View File

@ -1,90 +0,0 @@
/*
*
* * Licensed to the Apache Software Foundation (ASF) under one or more
* * contributor license agreements. See the NOTICE file distributed with
* * this work for additional information regarding copyright ownership.
* * The ASF licenses this file to You under the Apache License, Version 2.0
* * (the "License"); you may not use this file except in compliance with
* * the License. You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package com.alibaba.boot.nacos.aot.context;
import com.alibaba.boot.nacos.aot.util.AotDetector;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import com.alibaba.nacos.spring.core.env.AbstractNacosPropertySourceBuilder;
import com.alibaba.nacos.spring.core.env.NacosPropertySourcePostProcessor;
import com.alibaba.spring.util.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import java.util.ArrayList;
import java.util.Map;
import static com.alibaba.nacos.spring.util.NacosBeanUtils.getConfigServiceBeanBuilder;
public class NacosPropertySourcePostProcessorForAot extends NacosPropertySourcePostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
String[] abstractNacosPropertySourceBuilderBeanNames = BeanUtils
.getBeanNames(beanFactory, AbstractNacosPropertySourceBuilder.class);
this.nacosPropertySourceBuilders = new ArrayList<AbstractNacosPropertySourceBuilder>(
abstractNacosPropertySourceBuilderBeanNames.length);
for (String beanName : abstractNacosPropertySourceBuilderBeanNames) {
this.nacosPropertySourceBuilders.add(beanFactory.getBean(beanName,
AbstractNacosPropertySourceBuilder.class));
}
NacosPropertySourcePostProcessor.beanFactory = beanFactory;
this.configServiceBeanBuilder = getConfigServiceBeanBuilder(beanFactory);
if (AotDetector.useGeneratedArtifacts()) {
// the type of all BeanDefinitions is RootBeanDefinition in AOT, but what we need is AnnotatedGenericBeanDefinition.
Map<String, Object> beansWithAnnotation = beanFactory.getBeansWithAnnotation(NacosPropertySource.class);
for (Map.Entry<String, Object> entry : beansWithAnnotation.entrySet()) {
processPropertySourceForAot(entry.getKey(), entry.getValue());
}
}
String[] beanNames = beanFactory.getBeanDefinitionNames();
for (String beanName : beanNames) {
processPropertySource(beanName, beanFactory);
}
}
private void processPropertySourceForAot(String beanName, Object bean) {
if (processedBeanNames.contains(beanName)) {
return;
}
BeanDefinition beanDefinition = null;
Class<?> aClass = bean.getClass();
NacosPropertySource[] annotations = aClass.getSuperclass().getAnnotationsByType(NacosPropertySource.class);
if (annotations.length != 0) {
beanDefinition = new AnnotatedGenericBeanDefinition(aClass.getSuperclass());
}
annotations = aClass.getAnnotationsByType(NacosPropertySource.class);
if (annotations.length != 0) {
beanDefinition = new AnnotatedGenericBeanDefinition(aClass);
}
doProcessPropertySource(beanName, beanDefinition);
processedBeanNames.add(beanName);
}
}

View File

@ -1,76 +0,0 @@
/*
*
* * Licensed to the Apache Software Foundation (ASF) under one or more
* * contributor license agreements. See the NOTICE file distributed with
* * this work for additional information regarding copyright ownership.
* * The ASF licenses this file to You under the Apache License, Version 2.0
* * (the "License"); you may not use this file except in compliance with
* * the License. You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package com.alibaba.boot.nacos.aot.hint;
import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import org.springframework.aot.generate.GenerationContext;
import org.springframework.beans.factory.aot.BeanRegistrationAotContribution;
import org.springframework.beans.factory.aot.BeanRegistrationAotProcessor;
import org.springframework.beans.factory.aot.BeanRegistrationCode;
import org.springframework.beans.factory.support.RegisteredBean;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* {@link NacosInjected} and {@link NacosValue} AotProcessor
* The fields annotated with {@link NacosInjected} or {@link NacosValue} must be added to the reflect-config.json
* @author SuperZ1999
*/
public class NacosAnnotationBeanRegistrationAotProcessor implements BeanRegistrationAotProcessor {
@Override
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
Class<?> beanClass = registeredBean.getBeanClass();
List<Field> fields = new ArrayList<>();
ReflectionUtils.doWithFields(beanClass, field -> {
NacosInjected injectedAnnotation = field.getDeclaredAnnotation(NacosInjected.class);
NacosValue nacosValueAnnotation = field.getDeclaredAnnotation(NacosValue.class);
if (injectedAnnotation != null || nacosValueAnnotation != null) {
fields.add(field);
}
});
if (fields.isEmpty()) {
return null;
}
return new AotContribution(fields);
}
private static class AotContribution implements BeanRegistrationAotContribution {
private final List<Field> fields;
public AotContribution() {
this.fields = new ArrayList<>();
}
public AotContribution(List<Field> fields) {
this.fields = fields;
}
@Override
public void applyTo(GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode) {
for (Field field : fields) {
generationContext.getRuntimeHints().reflection().registerField(field);
}
}
}
}

View File

@ -1,45 +0,0 @@
/*
*
* * Licensed to the Apache Software Foundation (ASF) under one or more
* * contributor license agreements. See the NOTICE file distributed with
* * this work for additional information regarding copyright ownership.
* * The ASF licenses this file to You under the Apache License, Version 2.0
* * (the "License"); you may not use this file except in compliance with
* * the License. You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package com.alibaba.boot.nacos.aot.util;
import org.springframework.core.NativeDetector;
import org.springframework.core.SpringProperties;
public abstract class AotDetector {
/**
* System property that indicates the application should run with AOT
* generated artifacts. If such optimizations are not available, it is
* recommended to throw an exception rather than fall back to the regular
* runtime behavior.
*/
public static final String AOT_ENABLED = "spring.aot.enabled";
/**
* Determine whether AOT optimizations must be considered at runtime. This
* is mandatory in a native image but can be triggered on the JVM using
* the {@value #AOT_ENABLED} Spring property.
* @return whether AOT optimizations must be considered
*/
public static boolean useGeneratedArtifacts() {
return (NativeDetector.inNativeImage() || SpringProperties.getFlag(AOT_ENABLED));
}
}

View File

@ -1,33 +0,0 @@
/*
*
* * Licensed to the Apache Software Foundation (ASF) under one or more
* * contributor license agreements. See the NOTICE file distributed with
* * this work for additional information regarding copyright ownership.
* * The ASF licenses this file to You under the Apache License, Version 2.0
* * (the "License"); you may not use this file except in compliance with
* * the License. You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package com.alibaba.boot.nacos.aot.util;
public abstract class NativeDetector {
// See https://github.com/oracle/graal/blob/master/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/ImageInfo.java
private static final boolean imageCode = (System.getProperty("org.graalvm.nativeimage.imagecode") != null);
/**
* Returns {@code true} if invoked in the context of image building or during image runtime, else {@code false}.
*/
public static boolean inNativeImage() {
return imageCode;
}
}

View File

@ -1,9 +0,0 @@
[
{
"name": "com.alibaba.boot.nacos.aot.context.NacosPropertySourcePostProcessorForAot",
"allDeclaredClasses": true,
"allDeclaredMethods": true,
"allDeclaredFields": true,
"allDeclaredConstructors": true
}
]

View File

@ -1,15 +0,0 @@
{
"resources": {
"includes": [
{
"pattern": "\\QMETA-INF/spring.handlers\\E"
},
{
"pattern": "\\QMETA-INF/spring.schemas\\E"
},
{
"pattern": "\\QMETA-INF/schemas/nacos.xsd\\E"
}
]
}
}

View File

@ -1,2 +0,0 @@
org.springframework.beans.factory.aot.BeanRegistrationAotProcessor=\
com.alibaba.boot.nacos.aot.hint.NacosAnnotationBeanRegistrationAotProcessor

View File

@ -18,7 +18,7 @@
<parent> <parent>
<groupId>com.alibaba.boot</groupId> <groupId>com.alibaba.boot</groupId>
<artifactId>nacos-spring-boot-parent</artifactId> <artifactId>nacos-spring-boot-parent</artifactId>
<version>${revision}</version> <version>0.1.2</version>
<relativePath>../nacos-spring-boot-parent</relativePath> <relativePath>../nacos-spring-boot-parent</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -54,20 +54,7 @@
<groupId>com.alibaba.nacos</groupId> <groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId> <artifactId>nacos-spring-context</artifactId>
<optional>true</optional> <optional>true</optional>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
</dependency>
<!-- Test Dependencies --> <!-- Test Dependencies -->
<dependency> <dependency>

View File

@ -16,14 +16,13 @@
*/ */
package com.alibaba.boot.nacos.common; package com.alibaba.boot.nacos.common;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.boot.diagnostics.AbstractFailureAnalyzer; import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;
import org.springframework.boot.diagnostics.FailureAnalysis; import org.springframework.boot.diagnostics.FailureAnalysis;
import com.alibaba.nacos.api.exception.NacosException;
/** /**
* An {@link AbstractFailureAnalyzer} that performs analysis of failures caused by a * An {@link AbstractFailureAnalyzer} that performs analysis of failures caused by a {@link NacosException}
* {@link NacosException}
* *
* @author <a href="mailto:fangjian0423@gmail.com">Jim</a> * @author <a href="mailto:fangjian0423@gmail.com">Jim</a>
*/ */
@ -33,32 +32,32 @@ public class NacosFailureAnalyzer extends AbstractFailureAnalyzer<NacosException
protected FailureAnalysis analyze(Throwable rootFailure, NacosException cause) { protected FailureAnalysis analyze(Throwable rootFailure, NacosException cause) {
StringBuilder description = new StringBuilder(); StringBuilder description = new StringBuilder();
switch (cause.getErrCode()) { switch (cause.getErrCode()) {
case NacosException.CLIENT_INVALID_PARAM: case NacosException.CLIENT_INVALID_PARAM:
description.append("client error: invalid param"); description.append("client error: invalid param");
break; break;
case NacosException.CLIENT_OVER_THRESHOLD: case NacosException.CLIENT_OVER_THRESHOLD:
description.append("client error: over client threshold"); description.append("client error: over client threshold");
break; break;
case NacosException.BAD_GATEWAY: case NacosException.BAD_GATEWAY:
description.append("server error: bad gateway"); description.append("server error: bad gateway");
break; break;
case NacosException.CONFLICT: case NacosException.CONFLICT:
description.append("server error: conflict"); description.append("server error: conflict");
break; break;
case NacosException.INVALID_PARAM: case NacosException.INVALID_PARAM:
description.append("server error: invalid param"); description.append("server error: invalid param");
break; break;
case NacosException.NO_RIGHT: case NacosException.NO_RIGHT:
description.append("server error: no right"); description.append("server error: no right");
break; break;
case NacosException.OVER_THRESHOLD: case NacosException.OVER_THRESHOLD:
description.append("server error: over threshold"); description.append("server error: over threshold");
break; break;
case NacosException.SERVER_ERROR: case NacosException.SERVER_ERROR:
description.append("server error: such as timeout"); description.append("server error: such as timeout");
break; break;
default: default:
description.append("unknown reason"); description.append("unknown reason");
} }
description.append(". ").append(cause.getErrMsg()); description.append(". ").append(cause.getErrMsg());
String action; String action;

Some files were not shown because too many files have changed in this diff Show More