Parcourir la Source

sprigboot热部署、引入nacos配置中心

weihf 5 ans auparavant
Parent
commit
793fc5807d

+ 13 - 0
ipu-rest-scaffold/pom.xml

@ -79,6 +79,19 @@
79 79
			<groupId>org.springframework.boot</groupId>
80 80
			<artifactId>spring-boot-starter-actuator</artifactId>
81 81
		</dependency>
82
		<!--devtools热部署-->
83
        <dependency>
84
            <groupId>org.springframework.boot</groupId>
85
            <artifactId>spring-boot-devtools</artifactId>
86
            <optional>true</optional>
87
            <scope>true</scope>
88
        </dependency>
89
        <!-- 引入nacos服务注册及配置中心 -->
90
        <dependency>
91
            <groupId>com.alibaba.boot</groupId>
92
            <artifactId>nacos-config-spring-boot-starter</artifactId>
93
            <version>${nacos-config.version}</version>
94
        </dependency>
82 95
83 96
	</dependencies>
84 97

+ 40 - 0
ipu-rest-scaffold/readme.md

@ -22,6 +22,7 @@ webapp下可存放静态页面,便于前后端开发联调。
22 22
###三、SQL统一管理
23 23
SQL被统一存放在classpath的sql路径下,如:sql.ipu.demo。
24 24
使用命名空间+id的方式定位SQL配置,DbSqlMgmtController有代码使用范例。
25

25 26
###四、ipu-nosql组件
26 27
- 1.ipu-nosql组件的引入
27 28
    - 以maven为例,请在pom.xml中引入ipu-nosql组件和mongodb驱动包。如果使用的springboot为2.2.1.RELEASE或更高版本时,则不再需要添加mongodb驱动包。因为该版本已支持3.11.2的mongodb驱动包。
@ -49,6 +50,7 @@ SQL被统一存放在classpath的sql路径下,如:sql.ipu.demo。
49 50
        <config name="needTranscation" value="true"/>
50 51
        ```
51 52
- 该组件使用案例在:MongoDbController中
53

52 54
###五、springboot优雅停止服务
53 55
- 1.组件的引入
54 56
    - 以maven为例,请在pom.xml中引入spring-boot-starter-actuator组件。
@ -74,6 +76,44 @@ SQL被统一存放在classpath的sql路径下,如:sql.ipu.demo。
74 76
- 3.停止springboot应用的http接口只支持POST。在linux下使用命令curl -X POST http://127.0.0.1:12581/MyActuator/shutdown;在windows下使用工具,选择POST方式。
75 77
- 4.测试案例见GracefulTestController.java。在浏览器里输入http://服务ip:port/ipu/graceful/hello
76 78

79
###六、springboot热部署
80
- 1.组件的引入
81
    - 以maven为例,请在pom.xml中引入spring-boot-devtools组件。
82
        ```xml
83
        <dependency>
84
            <groupId>org.springframework.boot</groupId>
85
            <artifactId>spring-boot-devtools</artifactId>
86
        </dependency>
87
        ```
88
- 2.在application.properties配置:
89
        ```properties
90
        #设置开启热部署
91
        spring.devtools.restart.enabled=true
92
        #重启目录
93
        spring.devtools.restart.additional-paths=src/main/java
94
        spring.devtools.restart.exclude=WEB-INF/**
95
        #页面热加载
96
        spring.freemarker.cache=false 
97
        ```
98
- 3.测试案例见NacosConfigController.java。
99

100
###七、nacos配置中心和注册中心
101
- 1.nacos配置中心组件的引入
102
    - 以maven为例,请在pom.xml中引入nacos组件。如果使用的springboot为2.x或更高版本时,需要使用0.2.1的nacos组件;使用的springboot为1.x,需要使用0.1.1的nacos组件。
103
        ```xml
104
        <dependency>
105
            <groupId>com.alibaba.boot</groupId>
106
            <artifactId>nacos-config-spring-boot-starter</artifactId>
107
            <version>0.1.1</version>
108
        </dependency>
109
        ```
110
- 2.nacos配置中心的配置文件为:application.properties
111
        ```properties
112
        nacos.config.server-addr=192.168.1.101:8848
113
        ```
114

115
- 3.nacos配置中心使用案例在NacosConfigController中。此案例只支持springboot,springcloud的示例不在当前工程。
116

77 117
###打包运行
78 118
java -Dipu.lic.path=ipu.lic -jar ipu-rest-scaffold.jar --server.port=8080
79 119


+ 4 - 1
ipu-rest-scaffold/src/main/java/com/ai/ipu/server/RestScaffoldStart.java

@ -18,7 +18,10 @@ public class RestScaffoldStart {
18 18
	    /*自定义Handler*/
19 19
	    defineHandler();
20 20
		/*注册异常信息编码配置*/
21
		IpuBaseException.registerCode(EXCEPTION_MESSAGES_CONFIG);
21
	    //热部署会多次加载,因此需要捕获并忽略异常
22
		try{
23
			IpuBaseException.registerCode(EXCEPTION_MESSAGES_CONFIG);
24
		}catch(Exception e) {}
22 25
		/*启动*/
23 26
	    IpuRestApplication.start(args);
24 27
	}

+ 89 - 0
ipu-rest-scaffold/src/main/java/com/ai/ipu/server/config/NacosListenerConfiguration.java

@ -0,0 +1,89 @@
1
package com.ai.ipu.server.config;
2

3
import static com.alibaba.nacos.api.common.Constants.DEFAULT_GROUP;
4

5
import javax.annotation.PostConstruct;
6

7
import org.slf4j.Logger;
8
import org.slf4j.LoggerFactory;
9
import org.springframework.context.ApplicationListener;
10
import org.springframework.context.annotation.Bean;
11
import org.springframework.context.annotation.Configuration;
12

13
import com.alibaba.nacos.api.annotation.NacosInjected;
14
import com.alibaba.nacos.api.config.ConfigService;
15
import com.alibaba.nacos.api.config.listener.AbstractListener;
16
import com.alibaba.nacos.api.config.listener.Listener;
17
import com.alibaba.nacos.api.exception.NacosException;
18
import com.alibaba.nacos.spring.context.event.config.NacosConfigListenerRegisteredEvent;
19
import com.alibaba.nacos.spring.context.event.config.NacosConfigPublishedEvent;
20
import com.alibaba.nacos.spring.context.event.config.NacosConfigReceivedEvent;
21
import com.alibaba.nacos.spring.context.event.config.NacosConfigRemovedEvent;
22

23
@Configuration
24
public class NacosListenerConfiguration {
25
	private static final Logger logger = LoggerFactory.getLogger(NacosListenerConfiguration.class);
26
	@NacosInjected
27
    private ConfigService configService;
28
	
29
	@PostConstruct
30
    public void init() throws NacosException {
31

32
        Listener listener = new AbstractListener() {
33
//            @Override
34
            public void receiveConfigInfo(String configInfo) {
35
            }
36
        };
37

38
        //添加事件监听
39
        configService.addListener("com.ai.ipu.nacos", DEFAULT_GROUP, listener);
40
        
41
        //取消事件监听
42
        //configService.removeListener("com.ai.ipu.nacos", DEFAULT_GROUP, listener);
43
    }
44

45

46
    @Bean
47
    public ApplicationListener<NacosConfigReceivedEvent> nacosConfigReceivedEventListener() {
48
        return new ApplicationListener<NacosConfigReceivedEvent>() {
49
//            @Override
50
            public void onApplicationEvent(NacosConfigReceivedEvent event) {
51
                logger.info("Listening on NacosConfigReceivedEvent -  dataId : {} , groupId : {} , " + "content : {} , "
52
                        + "source : {}", event.getDataId(), event.getGroupId(), event.getContent(), event.getSource());
53
            }
54
        };
55
    }
56

57
    @Bean
58
    public ApplicationListener<NacosConfigRemovedEvent> nacosConfigRemovedEventListener() {
59
        return new ApplicationListener<NacosConfigRemovedEvent>() {
60
//            @Override
61
            public void onApplicationEvent(NacosConfigRemovedEvent event) {
62
                logger.info("Listening on NacosConfigRemovedEvent -  dataId : {} , groupId : {} , " + "removed : {} , "
63
                        + "source : {}", event.getDataId(), event.getGroupId(), event.isRemoved(), event.getSource());
64
            }
65
        };
66
    }
67

68
    @Bean
69
    public ApplicationListener<NacosConfigListenerRegisteredEvent> nacosConfigListenerRegisteredEventListener() {
70
        return new ApplicationListener<NacosConfigListenerRegisteredEvent>() {
71
//            @Override
72
            public void onApplicationEvent(NacosConfigListenerRegisteredEvent event) {
73
                logger.info("Listening on NacosConfigListenerRegisteredEvent -  dataId : {} , groupId : {} , " + "registered : {} , "
74
                        + "source : {}", event.getDataId(), event.getGroupId(), event.isRegistered(), event.getSource());
75
            }
76
        };
77
    }
78

79
    @Bean
80
    public ApplicationListener<NacosConfigPublishedEvent> nacosConfigPublishedEvent() {
81
        return new ApplicationListener<NacosConfigPublishedEvent>() {
82
//            @Override
83
            public void onApplicationEvent(NacosConfigPublishedEvent event) {
84
                logger.info("Listening on NacosConfigPublishedEvent -  dataId : {} , groupId : {} , " + "published : {} , "
85
                        + "source : {}", event.getDataId(), event.getGroupId(), event.isPublished(), event.getSource());
86
            }
87
        };
88
    }
89
}

+ 65 - 0
ipu-rest-scaffold/src/main/java/com/ai/ipu/server/control/NacosConfigController.java

@ -0,0 +1,65 @@
1
package com.ai.ipu.server.control;
2

3
import static com.alibaba.nacos.api.common.Constants.DEFAULT_GROUP;
4

5
import org.slf4j.Logger;
6
import org.slf4j.LoggerFactory;
7
import org.springframework.stereotype.Controller;
8
import org.springframework.web.bind.annotation.RequestMapping;
9
import org.springframework.web.bind.annotation.ResponseBody;
10

11
import com.ai.ipu.data.JMap;
12
import com.alibaba.nacos.api.annotation.NacosInjected;
13
import com.alibaba.nacos.api.config.ConfigService;
14
import com.alibaba.nacos.api.config.annotation.NacosValue;
15
import com.alibaba.nacos.api.exception.NacosException;
16
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
17

18
@Controller
19
@RequestMapping("/nacos/config")
20
@NacosPropertySource(dataId = "com.ai.ipu.nacos", autoRefreshed = true)
21
public class NacosConfigController {
22
	private static final Logger logger = LoggerFactory.getLogger(NacosConfigController.class);
23
	
24
	//用于发布消息到配置中心
25
	@NacosInjected
26
    private ConfigService configService;
27
	
28
	//如果配置中心没有dataId以及sql的配置,则取defaultValue
29
	//autoRefreshed:是否动态刷新。如果是动态刷新,则配置中心dataId以及sql的配置发生变动,则取配置中心的数据;
30
	//如果不是动态刷新,则在应用启动时去配置中心获取一次dataId以及sql的配置
31
	@NacosValue(value = "${sql:defaultValue}", autoRefreshed = true)
32
    private String sql;
33
	
34
	 @ResponseBody
35
	 @RequestMapping("/getSql")
36
	 public String getSql(JMap params) throws Exception {
37
		 return sql;
38
	 }
39
	 
40
	 @ResponseBody
41
	 @RequestMapping("/setSql")
42
	 public boolean setSql(JMap params) throws Exception {
43
		 try {
44
			    //将select * from display.tab_page_info发布到配置中心,dataId=com.ai.ipu.nacos,变量名=sql
45
	            configService.publishConfig("com.ai.ipu.nacos", DEFAULT_GROUP, "sql = select * from display.tab_page_info");
46
	            return true;
47
	        } catch (NacosException e) {
48
	            e.printStackTrace();
49
	            return false;
50
	        }
51
	 }
52
	 /* 用于测试热加载 */
53
	 @ResponseBody
54
	 @RequestMapping("/removeSql")
55
	 public boolean removeSql(JMap params) throws Exception {
56
		 try {
57
			    //从配置中心删除配置,dataId=com.ai.ipu.nacos
58
	            configService.removeConfig("com.ai.ipu.nacos", DEFAULT_GROUP);
59
	            return true;
60
	        } catch (NacosException e) {
61
	            e.printStackTrace();
62
	            return false;
63
	        }
64
	 }
65
}

+ 11 - 0
ipu-rest-scaffold/src/main/resources/dev/application.properties

@ -32,3 +32,14 @@ management.context-path=/MyActuator
32 32
management.port=12581
33 33
# 不允许远程管理连接(不允许外部调用保证安全)
34 34
management.address=127.0.0.1
35

36
#设置开启热部署
37
spring.devtools.restart.enabled=true
38
#重启目录
39
spring.devtools.restart.additional-paths=src/main/java
40
spring.devtools.restart.exclude=WEB-INF/**
41
#页面热加载
42
spring.freemarker.cache=false 
43

44
###配置nacos
45
nacos.config.server-addr=10.1.234.70:8848