Java之SpringCloud nocos注冊(cè)中心講解
一、nacos是什么?
Nacos是用來發(fā)現(xiàn)、配置和管理微服務(wù)。Nacos提供了一組簡(jiǎn)單易用的特性集,幫助快速實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置、服務(wù)元數(shù)據(jù)及流量管理。
二、使用步驟
1.安裝nacos 服務(wù)器
直接運(yùn)行 startup.cmd 訪問 localhost:8848/nacos
初始密碼 nacos nacos
2.導(dǎo)入依賴和配置yaml
父項(xiàng)目依賴pom文件
<?xml version="1.0" encoding="UTF-8"?> <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> <groupId>com.csdn</groupId> <artifactId>springcloud_nacos</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>springcloud_share_6002</module> <module>springcloud_user_6001</module> <module>springcloud_common</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <junit.version>4.12</junit.version> <lombok.version>1.18.16</lombok.version> <log4j.version>1.2.17</log4j.version> <logback-core.version>1.2.3</logback-core.version> <mysql-connector-java.version>8.0.21</mysql-connector-java.version> <druid.version>1.1.23</druid.version> <mybatis-spring-boot-starter.version>2.1.4</mybatis-spring-boot-starter.version> <spring-boot-dependencies.version>2.3.8.RELEASE</spring-boot-dependencies.version> <spring-cloud-dependencies.version>Hoxton.SR9</spring-cloud-dependencies.version> <spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version> <swagger.version>2.7.0</swagger.version> <pagehelper.version>1.2.3</pagehelper.version> <jodatime.version>2.10.1</jodatime.version> <jjwt.version>0.10.7</jjwt.version> </properties> <dependencyManagement> <dependencies> <!--很重要的包:springcloud的依賴--> <!-- <scope>import</scope>解決單繼承問題,類似parent標(biāo)簽, --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud-dependencies.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring-cloud-alibaba--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!--springboot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot-dependencies.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!--數(shù)據(jù)庫(kù)--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector-java.version}</version> </dependency> <!--數(shù)據(jù)源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <!--mybatis的springboot啟動(dòng)器--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis-spring-boot-starter.version}</version> </dependency> <!--日志測(cè)試--> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> <!--log4j--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${logback-core.version}</version> </dependency> <!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger.version}</version> </dependency> <!--swagger ui--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger.version}</version> </dependency> <!--druid alibaba--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>${pagehelper.version}</version> </dependency> <!--日期時(shí)間工具--> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>${jodatime.version}</version> </dependency> <!-- JWT --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>${jjwt.version}</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>${jjwt.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>${jjwt.version}</version> <scope>runtime</scope> </dependency> </dependencies> </dependencyManagement> <build> <!--打包插件--> </build> </project>
在需要被nacos發(fā)現(xiàn)的微服務(wù)個(gè)module加上nacos依賴
<!--服務(wù)注冊(cè)--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
springcloud_common的pom依賴
<?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <artifactId>springcloud_nacos</artifactId> <groupId>com.csdn</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springcloud_common</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> </dependency> <!--spring默認(rèn)使用yml中的配置,但有時(shí)候要用傳統(tǒng)的xml或properties配置,就需要使用spring-boot-configuration-processor了--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <!--服務(wù)注冊(cè)--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--服務(wù)容錯(cuò)--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!--feign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- JWT --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> </project>
@Configuration @EnableSwagger2 public class Swagger2Config { /** * 定義接口的總體信息 * * @return */ private ApiInfo webApiInfo() { return new ApiInfoBuilder() .title("Swagger API 文檔") .description("即使再小的帆也能遠(yuǎn)航") .version("1.0") .contact(new Contact("liar", "http://www.jsxllht.com", "**********6@qq.com")) .build(); } private ApiInfo adminApiInfo() { return new ApiInfoBuilder() .title("Swagger Admin 文檔") .description("即使再小的帆也能遠(yuǎn)航") .version("1.0") .contact(new Contact("liar", "http://www.jsxllht.com", "**********6@qq.co")) .build(); } @Bean public Docket webApiConfig() { return new Docket(DocumentationType.SWAGGER_2) .groupName("webApi") // 用戶組 .apiInfo(webApiInfo()) // 組的信息 .select() //只顯示api路徑下的頁(yè)面 .paths(Predicates.and(PathSelectors.regex("/api/.*"))) // 用戶接口的判斷 .build(); } @Bean public Docket adminApiConfig() { return new Docket(DocumentationType.SWAGGER_2) .groupName("adminApi") // 管路⚪組 .apiInfo(adminApiInfo()) // 組的信息 .select() //只顯示admin路徑下的頁(yè)面 .paths(Predicates.and(PathSelectors.regex("/admin/.*"))) .build(); } }
/** * 業(yè)務(wù)異常類 */ @Data @NoArgsConstructor @AllArgsConstructor @Builder public class AppException extends RuntimeException{ private String code; private String message; public AppException(ResponseEnum responseEnum){ this.code = responseEnum.getCode(); this.message = responseEnum.getMessage(); } }
// 這是一個(gè)controller 的增強(qiáng)類【專門在controller 拋出異常的時(shí)候 增強(qiáng)】 @ControllerAdvice public class ControllerExceptionAdvice { /** * 如果拋出的是 AppException 的增強(qiáng) * 返回值 就是返回的頁(yè)面 * 參數(shù): controller 拋出的異常 */ @ExceptionHandler(AppException.class) @ResponseBody public R appExceptionHandler(AppException ex, HttpServletRequest request){ return new R(ex.getCode(),ex.getMessage(),null); } /** * 如果拋出的是Exception 的增強(qiáng) */ @ExceptionHandler(Exception.class) @ResponseBody public R exceptionHandler(Exception ex, HttpServletRequest request){ ex.printStackTrace(); return new R(ResponseEnum.SYSTEM_ERROR,null); } }
@Data @AllArgsConstructor @NoArgsConstructor @Builder // 創(chuàng)建統(tǒng)一的返回格式 public class R<T> { private String code; private String message; private T data; public R(ResponseEnum responseEnum, T data) { this.code = responseEnum.getCode(); this.message = responseEnum.getMessage(); this.data = data; } }
public enum ResponseEnum { SUCCESS("200","成功003"), USERNAME_NOT_FOUND("300","用戶名不存在"), USERNAME_OR_PASSWORD_INVALIDATE("301","用戶名或者密碼錯(cuò)誤"), ROLE_NO_MENUS("302","此角色沒有任何菜單權(quán)限,請(qǐng)盡早分配"), HAS_NO_TOKEN("303","還沒有登錄"), TOKEN_ERROR("304","別想試圖偽造令牌"), TOKEN_TIMEOUT("305","對(duì)不起登錄狀態(tài)已經(jīng)失效,請(qǐng)重新登錄"), HAS_NO_RIGHT("306","權(quán)限不足"), SYSTEM_ERROR("500","發(fā)生未知異常。。。"), FEIGN_BSUY("307","系統(tǒng)正忙,稍后再試。。"), FLOW_BLOCK("308","流量被限制了,請(qǐng)稍后再使"), DEG_BLOCK("309","系統(tǒng)很忙,稍后再試。。。"), SMS_ERROR("310","短信發(fā)送失敗,請(qǐng)稍后再試。。。"), SMS_SEND_ERROR_BUSINESS_LIMIT_CONTROL("311","發(fā)送短信太頻繁,過會(huì)再發(fā)。。。"), CODE_ERROR("312","驗(yàn)證碼錯(cuò)誤請(qǐng)重試"), CODE_EXCPTION("313","驗(yàn)證碼超時(shí)"), ACCOUNT_NO_EXISTS("314","用戶不存在"), STATUS_BE_MODIFIED("315","用戶已被審核") ; private String code; private String message; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } ResponseEnum(String code, String message) { this.code = code; this.message = message; } }
springcloud_user_6001的yaml(在注冊(cè)中心服務(wù)的名字 不能一樣)
server: port: 6001 #數(shù)據(jù)源 spring: datasource: druid: url: jdbc:mysql://localhost:3306/hub_user_center?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT driver-class-name: com.mysql.cj.jdbc.Driver username: root password: 123456 initial-size: 10 max-active: 50 min-idle: 10 max-wait: 60000 pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 # mysql 數(shù)據(jù)庫(kù)的特征 會(huì)關(guān)閉已經(jīng)連接了8個(gè)小時(shí)的連接 validation-query: SELECT 1 FROM DUAL application: name: user-6001 cloud: nacos: discovery: server-addr: 127.0.0.1:8848 # mybatis 配置 mybatis: # 掃描映射文件 mapper-locations: classpath:mapper/*.xml configuration: # 開啟駝峰映射配置 map-underscore-to-camel-case: true # log # 整個(gè)工程只答應(yīng)info 以及以上級(jí)別的日志 logging: level: root: info com.csqf.mapper: debug
springcloud_share_6002的yaml(在注冊(cè)中心服務(wù)的名字 不能一樣)
server: port: 6002 #數(shù)據(jù)源 spring: datasource: druid: url: jdbc:mysql://localhost:3306/hub_share_center?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT driver-class-name: com.mysql.cj.jdbc.Driver username: root password: 123456 initial-size: 10 max-active: 50 min-idle: 10 max-wait: 60000 pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 # mysql 數(shù)據(jù)庫(kù)的特征 會(huì)關(guān)閉已經(jīng)連接了8個(gè)小時(shí)的連接 validation-query: SELECT 1 FROM DUAL application: name: share-6002 cloud: nacos: discovery: server-addr: 127.0.0.1:8848 # mybatis 配置 mybatis: # 掃描映射文件 mapper-locations: classpath:mapper/*.xml configuration: # 開啟駝峰映射配置 map-underscore-to-camel-case: true # log # 整個(gè)工程只答應(yīng)info 以及以上級(jí)別的日志 logging: level: root: info com.csqf.mapper: debug
2.RestTemplate
RestTemplate是Spring Resources中一個(gè)訪問第三方RESTful API接口的網(wǎng)絡(luò)請(qǐng)求框架。RestTemplate的設(shè)計(jì)原則和其他Spring Template(例如JdbcTemplate、JmsTemplate)類!,都是為執(zhí)行復(fù)雜任務(wù)提供了一個(gè)具有默認(rèn)行為的簡(jiǎn)單方法。
設(shè)置RestTemplate為Bean
springcloud_user_6001中寫一個(gè)查詢方法代碼如下(示例):
@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public String getUserById(Integer id) { User user = userMapper.selectByPrimaryKey(id); if ("".equals(user)){ return ""; } return user.getUserName(); } }
在springcloud_share_6002寫一個(gè)DTO(示例):
繼承Share實(shí)力類,加上user中返回的userName
@Data public class ShareDto extends Share { private String userName; }
在springcloud_share_6002中使用RestTemplate調(diào)用user并得到userName
@RestController @RequestMapping("/api/share") public class ShareContoller { @Autowired private ShareServiceImpl shareService; @Autowired private RestTemplate restTemplate; @GetMapping("/{id}") public R getShareById(@PathVariable("id") Integer id){ Share share = shareService.getShareById(id); R r = restTemplate.getForObject("http://localhost:6001/api/user/" + share.getUserId(), R.class); String s = r.getData().toString(); ShareDto shareDto = new ShareDto(); BeanUtils.copyProperties(share,shareDto); shareDto.setUserName(s); return new R(ResponseEnum.SUCCESS,shareDto); } }
最后訪問swagger(http://localhost:6002/swagger-ui.html)測(cè)試得到dto實(shí)體類中的對(duì)象
總結(jié)
nacos的作用就是一個(gè)注冊(cè)中心,用來管理注冊(cè)上來的各個(gè)微服務(wù)。
到此這篇關(guān)于Java之SpringCloud nocos注冊(cè)中心講解的文章就介紹到這了,更多相關(guān)Java之SpringCloud nocos內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringCloud中的Eureka注冊(cè)中心詳細(xì)解讀
- springcloud本地服務(wù)不注冊(cè)到注冊(cè)中心的解決方案
- SpringCloud zookeeper作為注冊(cè)中心使用介紹
- SpringCloud注冊(cè)中心之consul詳細(xì)講解使用方法
- SpringCloud?Eureka服務(wù)注冊(cè)中心應(yīng)用入門詳解
- SpringBoot項(xiàng)目改為SpringCloud項(xiàng)目使用nacos作為注冊(cè)中心的方法
- 淺析SpringCloud Alibaba-Nacos 作為注冊(cè)中心示例代碼
- Springcloud-nacos實(shí)現(xiàn)配置和注冊(cè)中心的方法
- springcloud實(shí)現(xiàn)注冊(cè)中心Eureka
- SpringCloud兩種注冊(cè)中心的實(shí)現(xiàn)
相關(guān)文章
IDEA調(diào)試技巧條件斷點(diǎn)實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了IDEA調(diào)試技巧條件斷點(diǎn)實(shí)現(xiàn)步驟詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09CMD運(yùn)行Intellij Idea編譯后的class文件操作
這篇文章主要介紹了CMD運(yùn)行Intellij Idea編譯后的class文件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02SpringBoot如何實(shí)現(xiàn)分離資源文件并打包
這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)分離資源文件并打包,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Spring?Security配置多個(gè)數(shù)據(jù)源并添加登錄驗(yàn)證碼的實(shí)例代碼
這篇文章主要介紹了Spring?Security配置多個(gè)數(shù)據(jù)源并添加登錄驗(yàn)證碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08idea啟動(dòng)tomcat控制臺(tái)中文亂碼的三種情況解決
本文主要介紹了idea啟動(dòng)tomcat控制臺(tái)中文亂碼,主要包括三種情況,分別介紹了一下解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Spring Boot高級(jí)教程之Spring Boot連接MySql數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了Spring Boot高級(jí)教程之Spring Boot連接MySql數(shù)據(jù)庫(kù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10SpringBoot使用Prometheus采集自定義指標(biāo)數(shù)據(jù)的方法詳解
隨著微服務(wù)在生產(chǎn)環(huán)境大規(guī)模部署和應(yīng)用,隨之而來也帶來了新的問題,其中比較關(guān)鍵的就是關(guān)于微服務(wù)的運(yùn)維和監(jiān)控,本文將結(jié)合微服務(wù)運(yùn)維監(jiān)控中的指標(biāo)監(jiān)控進(jìn)行詳細(xì)的說明,需要的朋友可以參考下2024-07-07