Commit fe8162db authored by Jason Song's avatar Jason Song Committed by GitHub

Merge branch 'master' into pr-eager-load-before-logging

parents ac2baee2 703398fc
...@@ -14,6 +14,7 @@ import com.ctrip.framework.apollo.configservice.service.config.DefaultConfigServ ...@@ -14,6 +14,7 @@ import com.ctrip.framework.apollo.configservice.service.config.DefaultConfigServ
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
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 org.springframework.security.crypto.password.NoOpPasswordEncoder;
/** /**
* @author Jason Song(song_s@ctrip.com) * @author Jason Song(song_s@ctrip.com)
...@@ -37,6 +38,11 @@ public class ConfigServiceAutoConfiguration { ...@@ -37,6 +38,11 @@ public class ConfigServiceAutoConfiguration {
return new DefaultConfigService(); return new DefaultConfigService();
} }
@Bean
public static NoOpPasswordEncoder passwordEncoder() {
return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
}
@Configuration @Configuration
static class MessageScannerConfiguration { static class MessageScannerConfiguration {
@Autowired @Autowired
......
...@@ -2,7 +2,6 @@ package com.ctrip.framework.apollo.portal; ...@@ -2,7 +2,6 @@ package com.ctrip.framework.apollo.portal;
import com.ctrip.framework.apollo.common.ApolloCommonConfig; import com.ctrip.framework.apollo.common.ApolloCommonConfig;
import com.ctrip.framework.apollo.openapi.PortalOpenApiConfig; import com.ctrip.framework.apollo.openapi.PortalOpenApiConfig;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
......
package com.ctrip.framework.apollo.portal.entity.bo;
import org.springframework.ldap.odm.annotations.Attribute;
import org.springframework.ldap.odm.annotations.Entry;
import org.springframework.ldap.odm.annotations.Id;
import javax.naming.Name;
/**
* @author xm.lin xm.lin@anxincloud.com
* @Description
* @date 18-8-9 下午4:43
*/
@Entry(base = "cn=Manager",objectClasses = {"inetOrgPerson"})
public class LdapUserInfo {
@Id
private Name id;
@Attribute(name = "cn")
private String username;
@Attribute(name = "sn")
private String realName;
@Attribute(name = "userPassword")
private String userPassword;
@Attribute(name = "mail")
private String mail;
public Name getId() {
return id;
}
public void setId(Name id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
}
...@@ -43,12 +43,14 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity; ...@@ -43,12 +43,14 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.LdapShaPasswordEncoder; import org.springframework.security.ldap.authentication.BindAuthenticator;
import org.springframework.security.ldap.authentication.LdapAuthenticationProvider;
import org.springframework.security.ldap.search.FilterBasedLdapUserSearch;
import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator;
import org.springframework.security.provisioning.JdbcUserDetailsManager; import org.springframework.security.provisioning.JdbcUserDetailsManager;
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint; import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler; import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;
@Configuration @Configuration
public class AuthConfiguration { public class AuthConfiguration {
...@@ -128,10 +130,8 @@ public class AuthConfiguration { ...@@ -128,10 +130,8 @@ public class AuthConfiguration {
casValidationFilter.setOrder(3); casValidationFilter.setOrder(3);
return casValidationFilter; return casValidationFilter;
} }
@Bean @Bean
public FilterRegistrationBean assertionHolder() { public FilterRegistrationBean assertionHolder() {
FilterRegistrationBean assertionHolderFilter = new FilterRegistrationBean(); FilterRegistrationBean assertionHolderFilter = new FilterRegistrationBean();
...@@ -168,7 +168,6 @@ public class AuthConfiguration { ...@@ -168,7 +168,6 @@ public class AuthConfiguration {
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("instance filter fail", e); throw new RuntimeException("instance filter fail", e);
} }
} }
private EventListener listener(String className) { private EventListener listener(String className) {
...@@ -191,10 +190,8 @@ public class AuthConfiguration { ...@@ -191,10 +190,8 @@ public class AuthConfiguration {
public SsoHeartbeatHandler ctripSsoHeartbeatHandler() { public SsoHeartbeatHandler ctripSsoHeartbeatHandler() {
return new CtripSsoHeartbeatHandler(); return new CtripSsoHeartbeatHandler();
} }
} }
/** /**
* spring.profiles.active = auth * spring.profiles.active = auth
*/ */
...@@ -287,8 +284,10 @@ public class AuthConfiguration { ...@@ -287,8 +284,10 @@ public class AuthConfiguration {
@Profile("ldap") @Profile("ldap")
@EnableConfigurationProperties(LdapProperties.class) @EnableConfigurationProperties(LdapProperties.class)
static class SpringSecurityLDAPAuthAutoConfiguration { static class SpringSecurityLDAPAuthAutoConfiguration {
@Autowired @Autowired
private LdapProperties properties; private LdapProperties properties;
@Autowired @Autowired
private Environment environment; private Environment environment;
...@@ -333,9 +332,10 @@ public class AuthConfiguration { ...@@ -333,9 +332,10 @@ public class AuthConfiguration {
@Bean @Bean
@ConditionalOnMissingBean(LdapOperations.class) @ConditionalOnMissingBean(LdapOperations.class)
public LdapTemplate ldapTemplate(ContextSource contextSource) { public LdapTemplate ldapTemplate(ContextSource contextSource) {
return new LdapTemplate(contextSource); LdapTemplate ldapTemplate = new LdapTemplate(contextSource);
ldapTemplate.setIgnorePartialResultException(true);
return ldapTemplate;
} }
} }
@Order(99) @Order(99)
...@@ -350,6 +350,27 @@ public class AuthConfiguration { ...@@ -350,6 +350,27 @@ public class AuthConfiguration {
@Autowired @Autowired
private LdapContextSource ldapContextSource; private LdapContextSource ldapContextSource;
@Bean
public FilterBasedLdapUserSearch userSearch() {
FilterBasedLdapUserSearch filterBasedLdapUserSearch = new FilterBasedLdapUserSearch("",
ldapProperties.getSearchFilter(), ldapContextSource);
filterBasedLdapUserSearch.setSearchSubtree(true);
return filterBasedLdapUserSearch;
}
@Bean
public LdapAuthenticationProvider ldapAuthProvider() {
BindAuthenticator bindAuthenticator = new BindAuthenticator(ldapContextSource);
bindAuthenticator.setUserSearch(userSearch());
DefaultLdapAuthoritiesPopulator defaultAuthAutoConfiguration = new DefaultLdapAuthoritiesPopulator(
ldapContextSource, null);
defaultAuthAutoConfiguration.setIgnorePartialResultException(true);
defaultAuthAutoConfiguration.setSearchSubtree(true);
LdapAuthenticationProvider ldapAuthenticationProvider = new LdapAuthenticationProvider(
bindAuthenticator, defaultAuthAutoConfiguration);
return ldapAuthenticationProvider;
}
@Override @Override
protected void configure(HttpSecurity http) throws Exception { protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); http.csrf().disable();
...@@ -367,12 +388,7 @@ public class AuthConfiguration { ...@@ -367,12 +388,7 @@ public class AuthConfiguration {
@Override @Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception { protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.ldapAuthentication() auth.authenticationProvider(ldapAuthProvider());
.userDnPatterns(ldapProperties.getUserDnPatterns())
.contextSource(ldapContextSource)
.passwordCompare()
.passwordEncoder(new LdapShaPasswordEncoder())
.passwordAttribute("userPassword");
} }
} }
......
...@@ -4,7 +4,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties; ...@@ -4,7 +4,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
...@@ -43,13 +42,16 @@ public class LdapProperties { ...@@ -43,13 +42,16 @@ public class LdapProperties {
*/ */
private boolean anonymousReadOnly; private boolean anonymousReadOnly;
/**
* User search filter
*/
private String searchFilter;
/** /**
* LDAP specification settings. * LDAP specification settings.
*/ */
private final Map<String, String> baseEnvironment = new HashMap<>(); private final Map<String, String> baseEnvironment = new HashMap<>();
private String userDnPatterns;
public String[] getUrls() { public String[] getUrls() {
return this.urls; return this.urls;
} }
...@@ -90,12 +92,12 @@ public class LdapProperties { ...@@ -90,12 +92,12 @@ public class LdapProperties {
this.anonymousReadOnly = anonymousReadOnly; this.anonymousReadOnly = anonymousReadOnly;
} }
public String getUserDnPatterns() { public String getSearchFilter() {
return userDnPatterns; return searchFilter;
} }
public void setUserDnPatterns(String userDnPatterns) { public void setSearchFilter(String searchFilter) {
this.userDnPatterns = userDnPatterns; this.searchFilter = searchFilter;
} }
public Map<String, String> getBaseEnvironment() { public Map<String, String> getBaseEnvironment() {
......
package com.ctrip.framework.apollo.portal.spi.ldap; package com.ctrip.framework.apollo.portal.spi.ldap;
import com.ctrip.framework.apollo.portal.entity.bo.LdapUserInfo; import static org.springframework.ldap.query.LdapQueryBuilder.query;
import com.ctrip.framework.apollo.core.utils.StringUtils;
import com.ctrip.framework.apollo.portal.entity.bo.UserInfo; import com.ctrip.framework.apollo.portal.entity.bo.UserInfo;
import com.ctrip.framework.apollo.portal.spi.UserService; import com.ctrip.framework.apollo.portal.spi.UserService;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Lists; import java.util.Arrays;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.ldap.core.ContextMapper;
import org.springframework.ldap.core.DirContextAdapter;
import org.springframework.ldap.core.LdapTemplate; import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.query.ContainerCriteria; import org.springframework.ldap.query.ContainerCriteria;
import org.springframework.ldap.query.LdapQueryBuilder;
import org.springframework.ldap.query.SearchScope; import org.springframework.ldap.query.SearchScope;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
...@@ -20,61 +24,71 @@ import org.springframework.util.CollectionUtils; ...@@ -20,61 +24,71 @@ import org.springframework.util.CollectionUtils;
*/ */
public class LdapUserService implements UserService { public class LdapUserService implements UserService {
@Value("${ldap.mapping.objectClass}")
private String objectClassAttrName;
@Value("${ldap.mapping.loginId}")
private String loginIdAttrName;
@Value("${ldap.mapping.userDisplayName}")
private String userDisplayNameAttrName;
@Value("${ldap.mapping.email}")
private String emailAttrName;
@Value("#{'${ldap.filter.memberOf:}'.split('\\|')}")
private String[] memberOf;
@Autowired @Autowired
private LdapTemplate ldapTemplate; private LdapTemplate ldapTemplate;
private static final String MEMBER_OF_ATTR_NAME = "memberOf";
private ContextMapper<UserInfo> ldapUserInfoMapper = (ctx) -> {
DirContextAdapter contextAdapter = (DirContextAdapter) ctx;
UserInfo userInfo = new UserInfo();
userInfo.setUserId(contextAdapter.getStringAttribute(loginIdAttrName));
userInfo.setName(contextAdapter.getStringAttribute(userDisplayNameAttrName));
userInfo.setEmail(contextAdapter.getStringAttribute(emailAttrName));
return userInfo;
};
private ContainerCriteria ldapQueryCriteria() {
ContainerCriteria criteria = query()
.searchScope(SearchScope.SUBTREE)
.where("objectClass").is(objectClassAttrName);
if (memberOf.length > 0 && !StringUtils.isEmpty(memberOf[0])) {
ContainerCriteria memberOfFilters = query().where(MEMBER_OF_ATTR_NAME).is(memberOf[0]);
Arrays.stream(memberOf).skip(1)
.forEach(filter -> memberOfFilters.or(MEMBER_OF_ATTR_NAME).is(filter));
criteria.and(memberOfFilters);
}
return criteria;
}
@Override @Override
public List<UserInfo> searchUsers(String keyword, int offset, int limit) { public List<UserInfo> searchUsers(String keyword, int offset, int limit) {
List<LdapUserInfo> ldapUserInfoList = null; ContainerCriteria criteria = ldapQueryCriteria();
if (Strings.isNullOrEmpty(keyword)) { if (!Strings.isNullOrEmpty(keyword)) {
ldapUserInfoList = ldapTemplate.findAll(LdapUserInfo.class); criteria.and(query().where(loginIdAttrName).like(keyword + "*").or(userDisplayNameAttrName)
} else { .like(keyword + "*"));
ContainerCriteria criteria = LdapQueryBuilder
.query().searchScope(SearchScope.SUBTREE)
.where("cn").like(keyword + "*")
.or("sn").like(keyword + "*");
ldapUserInfoList = ldapTemplate.find(criteria, LdapUserInfo.class);
} }
return convertLdapUserToUserInfo(ldapUserInfoList); return ldapTemplate.search(criteria, ldapUserInfoMapper);
} }
@Override @Override
public UserInfo findByUserId(String userId) { public UserInfo findByUserId(String userId) {
ContainerCriteria criteria = LdapQueryBuilder.query().where("cn").is(userId); return ldapTemplate
LdapUserInfo ldapUser = ldapTemplate.findOne(criteria, LdapUserInfo.class); .searchForObject(ldapQueryCriteria().and(loginIdAttrName).is(userId), ldapUserInfoMapper);
UserInfo userInfo = new UserInfo();
userInfo.setUserId(ldapUser.getUsername());
userInfo.setName(ldapUser.getRealName());
userInfo.setEmail(ldapUser.getMail());
return userInfo;
} }
@Override @Override
public List<UserInfo> findByUserIds(List<String> userIds) { public List<UserInfo> findByUserIds(List<String> userIds) {
if (!CollectionUtils.isEmpty(userIds)) { if (CollectionUtils.isEmpty(userIds)) {
LdapQueryBuilder ldapQueryBuilder = LdapQueryBuilder.query() return null;
.searchScope(SearchScope.SUBTREE); } else {
ContainerCriteria criteria = ldapQueryBuilder.where("cn").is(userIds.get(0)); ContainerCriteria criteria = ldapQueryCriteria()
userIds.stream().skip(1).forEach(userId -> { .and(query().where(loginIdAttrName).is(userIds.get(0)));
criteria.or("cn").is(userId); userIds.stream().skip(1).forEach(userId -> criteria.or(loginIdAttrName).is(userId));
}); return ldapTemplate.search(criteria, ldapUserInfoMapper);
List<LdapUserInfo> ldapUserInfoList = ldapTemplate.find(criteria, LdapUserInfo.class);
return convertLdapUserToUserInfo(ldapUserInfoList);
} }
return null;
} }
private List<UserInfo> convertLdapUserToUserInfo(List<LdapUserInfo> ldapUserInfoList) {
List<UserInfo> userInfoList = Lists.newArrayList();
if (!CollectionUtils.isEmpty(ldapUserInfoList)) {
ldapUserInfoList.stream().map(p -> {
UserInfo userInfo = new UserInfo();
userInfo.setUserId(p.getUsername());
userInfo.setName(p.getRealName());
userInfo.setEmail(p.getMail());
return userInfo;
}).forEach(userInfoList::add);
}
return userInfoList;
}
} }
...@@ -175,8 +175,6 @@ ...@@ -175,8 +175,6 @@
<!-- bootstrap.js --> <!-- bootstrap.js -->
<script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script> <script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
<!--nicescroll-->
<script src="../vendor/jquery.nicescroll.min.js"></script>
<script src="../vendor/lodash.min.js"></script> <script src="../vendor/lodash.min.js"></script>
<script src="../vendor/select2/select2.min.js" type="text/javascript"></script> <script src="../vendor/select2/select2.min.js" type="text/javascript"></script>
......
...@@ -353,9 +353,6 @@ ...@@ -353,9 +353,6 @@
<!--lodash.js--> <!--lodash.js-->
<script src="vendor/lodash.min.js" type="text/javascript"></script> <script src="vendor/lodash.min.js" type="text/javascript"></script>
<!--nicescroll-->
<script src="vendor/jquery.nicescroll.min.js"></script>
<!--angular--> <!--angular-->
<script src="vendor/angular/angular.min.js"></script> <script src="vendor/angular/angular.min.js"></script>
<script src="vendor/angular/angular-resource.min.js"></script> <script src="vendor/angular/angular-resource.min.js"></script>
......
...@@ -257,9 +257,6 @@ ...@@ -257,9 +257,6 @@
<!-- bootstrap.js --> <!-- bootstrap.js -->
<script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script> <script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
<!--nicescroll-->
<script src="../vendor/jquery.nicescroll.min.js"></script>
<script src="../vendor/diff.min.js" type="text/javascript"></script> <script src="../vendor/diff.min.js" type="text/javascript"></script>
<!--biz--> <!--biz-->
......
...@@ -224,9 +224,6 @@ ...@@ -224,9 +224,6 @@
<!-- bootstrap.js --> <!-- bootstrap.js -->
<script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script> <script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
<!--nicescroll-->
<script src="../vendor/jquery.nicescroll.min.js"></script>
<script src="../vendor/clipboard.min.js" type="text/javascript"></script> <script src="../vendor/clipboard.min.js" type="text/javascript"></script>
<!--biz--> <!--biz-->
<script type="application/javascript" src="../scripts/app.js"></script> <script type="application/javascript" src="../scripts/app.js"></script>
......
...@@ -196,8 +196,6 @@ ...@@ -196,8 +196,6 @@
<!-- bootstrap.js --> <!-- bootstrap.js -->
<script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script> <script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
<!--nicescroll-->
<script src="../vendor/jquery.nicescroll.min.js"></script>
<script src="../vendor/lodash.min.js"></script> <script src="../vendor/lodash.min.js"></script>
<script src="../vendor/select2/select2.min.js" type="text/javascript"></script> <script src="../vendor/select2/select2.min.js" type="text/javascript"></script>
......
...@@ -119,9 +119,6 @@ ...@@ -119,9 +119,6 @@
<!-- bootstrap.js --> <!-- bootstrap.js -->
<script src="vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script> <script src="vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
<!--nicescroll-->
<script src="vendor/jquery.nicescroll.min.js"></script>
<script type="application/javascript" src="scripts/app.js"></script> <script type="application/javascript" src="scripts/app.js"></script>
<script type="application/javascript" src="scripts/services/AppService.js"></script> <script type="application/javascript" src="scripts/services/AppService.js"></script>
<script type="application/javascript" src="scripts/services/EnvService.js"></script> <script type="application/javascript" src="scripts/services/EnvService.js"></script>
......
...@@ -143,9 +143,6 @@ ...@@ -143,9 +143,6 @@
<!-- bootstrap.js --> <!-- bootstrap.js -->
<script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script> <script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
<!--nicescroll-->
<script src="../vendor/jquery.nicescroll.min.js"></script>
<script src="../vendor/select2/select2.min.js" type="text/javascript"></script> <script src="../vendor/select2/select2.min.js" type="text/javascript"></script>
<!--biz--> <!--biz-->
......
...@@ -189,8 +189,6 @@ ...@@ -189,8 +189,6 @@
<!-- bootstrap.js --> <!-- bootstrap.js -->
<script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script> <script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
<!--nicescroll-->
<script src="../vendor/jquery.nicescroll.min.js"></script>
<script src="../vendor/lodash.min.js"></script> <script src="../vendor/lodash.min.js"></script>
<script src="../vendor/select2/select2.min.js" type="text/javascript"></script> <script src="../vendor/select2/select2.min.js" type="text/javascript"></script>
......
$(document).ready(function () { $(document).ready(function () {
// nicescroll
$("html").niceScroll({
styler: "fb",
cursorcolor: "#e8403f",
cursorwidth: '6',
cursorborderradius: '10px',
background: '#404040',
spacebarenabled: false,
cursorborder: '',
zindex: '1000'
});
// bootstrap tooltip & textarea scroll // bootstrap tooltip & textarea scroll
setInterval(function () { setInterval(function () {
$('[data-tooltip="tooltip"]').tooltip({ $('[data-tooltip="tooltip"]').tooltip({
trigger : 'hover' trigger : 'hover'
}); });
$("textarea").niceScroll({cursoropacitymax: 0});
$("pre").niceScroll({cursoropacitymax: 0});
}, 1000); }, 1000);
setTimeout(function () {
$(".release-history-list").niceScroll({cursoropacitymax: 0});
}, 2500);
}); });
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423 // (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
......
...@@ -117,8 +117,6 @@ ...@@ -117,8 +117,6 @@
<!-- bootstrap.js --> <!-- bootstrap.js -->
<script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script> <script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
<!--nicescroll-->
<script src="../vendor/jquery.nicescroll.min.js"></script>
<script src="../vendor/lodash.min.js"></script> <script src="../vendor/lodash.min.js"></script>
<script src="../vendor/select2/select2.min.js" type="text/javascript"></script> <script src="../vendor/select2/select2.min.js" type="text/javascript"></script>
......
...@@ -141,16 +141,62 @@ Prod <br/> ...@@ -141,16 +141,62 @@ Prod <br/>
# FAQ # FAQ
- 关于修改的 Dockerfile <br/> ## 关于修改的 Dockerfile
添加 ENV 和 entrypoint.sh, 启动 server 需要的配置, 在 kubernetes yaml 文件中可以通过 configmap 传入、也可以通过 ENV 传入 <br/> 添加 ENV 和 entrypoint.sh, 启动 server 需要的配置, 在 kubernetes yaml 文件中可以通过 configmap 传入、也可以通过 ENV 传入
关于 Dockerfile、entrypoint.sh 具体内容, 你可以查看文件里的内容 关于 Dockerfile、entrypoint.sh 具体内容, 你可以查看文件里的内容
- 关于 kubernetes yaml 文件 <br/> ## 关于 kubernetes yaml 文件
具体内容请查看 scripts/apollo-on-kubernetes/kubernetes/service-apollo-portal-server.yaml 注释 <br/> 具体内容请查看 `scripts/apollo-on-kubernetes/kubernetes/service-apollo-portal-server.yaml` 注释 <br/>
其他类似 其他类似
- 关于 eureka.service.url <br/> ## 关于 eureka.service.url
请在 ApolloConfigDB.ServerConfig 表中配置, 使用 meta-server(即 config-server) 的 pod name, config-server 务必使用 statefulset <br/> 使用 meta-server(即 config-server) 的 pod name, config-server 务必使用 statefulset。
以 apollo-env-dev 为例: <br/> 格式为:`http://<config server pod名>.<meta server 服务名>:<meta server端口号>/eureka/`
('eureka.service.url', 'default', 'http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/', 'Eureka服务Url,多个service以英文逗号分隔') <br/>
你可以精简 config-server pod 的 name, 示例的长名字是为了更好的阅读与理解 以 apollo-env-dev 为例:
\ No newline at end of file ```bash
('eureka.service.url', 'default', 'http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/', 'Eureka服务Url,多个service以英文逗号分隔')
```
你可以精简 config-server pod 的 name, 示例的长名字是为了更好的阅读与理解。
### 方式一:通过Spring Boot文件 application-github.properties配置(推荐)
推荐此方式配置 `eureka.service.url`,因为可以通过ConfigMap的方式传入容器,无需再修改数据库的字段。
Admin Server的配置:
```yaml
---
# configmap for apollo-admin-server-dev
kind: ConfigMap
apiVersion: v1
metadata:
namespace: sre
name: configmap-apollo-admin-server-dev
data:
application-github.properties: |
spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-dev-env-mariadb.sre:3306/DevApolloConfigDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = test
eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/
```
Config Server的配置:
```yaml
---
# configmap for apollo-config-server-dev
kind: ConfigMap
apiVersion: v1
metadata:
namespace: sre
name: configmap-apollo-config-server-dev
data:
application-github.properties: |
spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-dev-env-mariadb.sre:3306/DevApolloConfigDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = m6bCdQXa00
eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/
```
### 方式二:修改数据表 ApolloConfigDB.ServerConfig
修改数据库表 ApolloConfigDB.ServerConfig的 eureka.service.url。
\ No newline at end of file
...@@ -11,6 +11,7 @@ data: ...@@ -11,6 +11,7 @@ data:
spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-dev-env.sre:3306/DevApolloConfigDB?characterEncoding=utf8 spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-dev-env.sre:3306/DevApolloConfigDB?characterEncoding=utf8
spring.datasource.username = FillInCorrectUser spring.datasource.username = FillInCorrectUser
spring.datasource.password = FillInCorrectPassword spring.datasource.password = FillInCorrectPassword
eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/
--- ---
kind: Service kind: Service
......
...@@ -11,6 +11,7 @@ data: ...@@ -11,6 +11,7 @@ data:
spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-dev-env.sre:3306/DevApolloConfigDB?characterEncoding=utf8 spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-dev-env.sre:3306/DevApolloConfigDB?characterEncoding=utf8
spring.datasource.username = FillInCorrectUser spring.datasource.username = FillInCorrectUser
spring.datasource.password = FillInCorrectPassword spring.datasource.password = FillInCorrectPassword
eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/
--- ---
kind: Service kind: Service
......
...@@ -11,6 +11,7 @@ data: ...@@ -11,6 +11,7 @@ data:
spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-prod-env.sre:3306/ProdApolloConfigDB?characterEncoding=utf8 spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-prod-env.sre:3306/ProdApolloConfigDB?characterEncoding=utf8
spring.datasource.username = FillInCorrectUser spring.datasource.username = FillInCorrectUser
spring.datasource.password = FillInCorrectPassword spring.datasource.password = FillInCorrectPassword
eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/
--- ---
kind: Service kind: Service
......
...@@ -11,6 +11,7 @@ data: ...@@ -11,6 +11,7 @@ data:
spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-prod-env.sre:3306/ProdApolloConfigDB?characterEncoding=utf8 spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-prod-env.sre:3306/ProdApolloConfigDB?characterEncoding=utf8
spring.datasource.username = FillInCorrectUser spring.datasource.username = FillInCorrectUser
spring.datasource.password = FillInCorrectPassword spring.datasource.password = FillInCorrectPassword
eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/
--- ---
kind: Service kind: Service
......
...@@ -11,6 +11,7 @@ data: ...@@ -11,6 +11,7 @@ data:
spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-test-alpha-env.sre:3306/TestAlphaApolloConfigDB?characterEncoding=utf8 spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-test-alpha-env.sre:3306/TestAlphaApolloConfigDB?characterEncoding=utf8
spring.datasource.username = FillInCorrectUser spring.datasource.username = FillInCorrectUser
spring.datasource.password = FillInCorrectPassword spring.datasource.password = FillInCorrectPassword
eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/
--- ---
kind: Service kind: Service
......
...@@ -11,6 +11,7 @@ data: ...@@ -11,6 +11,7 @@ data:
spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-test-alpha-env.sre:3306/TestAlphaApolloConfigDB?characterEncoding=utf8 spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-test-alpha-env.sre:3306/TestAlphaApolloConfigDB?characterEncoding=utf8
spring.datasource.username = FillInCorrectUser spring.datasource.username = FillInCorrectUser
spring.datasource.password = FillInCorrectPassword spring.datasource.password = FillInCorrectPassword
eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/
--- ---
kind: Service kind: Service
......
...@@ -11,6 +11,7 @@ data: ...@@ -11,6 +11,7 @@ data:
spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-test-beta-env.sre:3306/TestBetaApolloConfigDB?characterEncoding=utf8 spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-test-beta-env.sre:3306/TestBetaApolloConfigDB?characterEncoding=utf8
spring.datasource.username = FillInCorrectUser spring.datasource.username = FillInCorrectUser
spring.datasource.password = FillInCorrectPassword spring.datasource.password = FillInCorrectPassword
eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/
--- ---
kind: Service kind: Service
......
...@@ -11,6 +11,7 @@ data: ...@@ -11,6 +11,7 @@ data:
spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-test-beta-env.sre:3306/TestBetaApolloConfigDB?characterEncoding=utf8 spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-test-beta-env.sre:3306/TestBetaApolloConfigDB?characterEncoding=utf8
spring.datasource.username = FillInCorrectUser spring.datasource.username = FillInCorrectUser
spring.datasource.password = FillInCorrectPassword spring.datasource.password = FillInCorrectPassword
eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/
--- ---
kind: Service kind: Service
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment