Java之SpringCloud nocos注冊中心講解
一、nacos是什么?
Nacos是用來發(fā)現(xiàn)、配置和管理微服務(wù)。Nacos提供了一組簡單易用的特性集,幫助快速實(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ù)庫-->
<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>
<!--日志測試-->
<!--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ù)注冊-->
<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ù)注冊-->
<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路徑下的頁面
.paths(Predicates.and(PathSelectors.regex("/api/.*"))) // 用戶接口的判斷
.build();
}
@Bean
public Docket adminApiConfig() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("adminApi") // 管路⚪組
.apiInfo(adminApiInfo()) // 組的信息
.select()
//只顯示admin路徑下的頁面
.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)
* 返回值 就是返回的頁面
* 參數(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)限,請盡早分配"),
HAS_NO_TOKEN("303","還沒有登錄"),
TOKEN_ERROR("304","別想試圖偽造令牌"),
TOKEN_TIMEOUT("305","對不起登錄狀態(tài)已經(jīng)失效,請重新登錄"),
HAS_NO_RIGHT("306","權(quán)限不足"),
SYSTEM_ERROR("500","發(fā)生未知異常。。。"),
FEIGN_BSUY("307","系統(tǒng)正忙,稍后再試。。"),
FLOW_BLOCK("308","流量被限制了,請稍后再使"),
DEG_BLOCK("309","系統(tǒng)很忙,稍后再試。。。"),
SMS_ERROR("310","短信發(fā)送失敗,請稍后再試。。。"),
SMS_SEND_ERROR_BUSINESS_LIMIT_CONTROL("311","發(fā)送短信太頻繁,過會再發(fā)。。。"),
CODE_ERROR("312","驗(yàn)證碼錯(cuò)誤請重試"),
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(在注冊中心服務(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ù)庫的特征 會關(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 以及以上級別的日志
logging:
level:
root: info
com.csqf.mapper: debug
springcloud_share_6002的yaml(在注冊中心服務(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ù)庫的特征 會關(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 以及以上級別的日志
logging:
level:
root: info
com.csqf.mapper: debug
2.RestTemplate
RestTemplate是Spring Resources中一個(gè)訪問第三方RESTful API接口的網(wǎng)絡(luò)請求框架。RestTemplate的設(shè)計(jì)原則和其他Spring Template(例如JdbcTemplate、JmsTemplate)類!,都是為執(zhí)行復(fù)雜任務(wù)提供了一個(gè)具有默認(rè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)測試得到dto實(shí)體類中的對象
總結(jié)
nacos的作用就是一個(gè)注冊中心,用來管理注冊上來的各個(gè)微服務(wù)。
到此這篇關(guān)于Java之SpringCloud nocos注冊中心講解的文章就介紹到這了,更多相關(guān)Java之SpringCloud nocos內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringCloud中的Eureka注冊中心詳細(xì)解讀
- springcloud本地服務(wù)不注冊到注冊中心的解決方案
- SpringCloud zookeeper作為注冊中心使用介紹
- SpringCloud注冊中心之consul詳細(xì)講解使用方法
- SpringCloud?Eureka服務(wù)注冊中心應(yīng)用入門詳解
- SpringBoot項(xiàng)目改為SpringCloud項(xiàng)目使用nacos作為注冊中心的方法
- 淺析SpringCloud Alibaba-Nacos 作為注冊中心示例代碼
- Springcloud-nacos實(shí)現(xiàn)配置和注冊中心的方法
- springcloud實(shí)現(xiàn)注冊中心Eureka
- SpringCloud兩種注冊中心的實(shí)現(xiàn)
相關(guān)文章
IDEA調(diào)試技巧條件斷點(diǎn)實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了IDEA調(diào)試技巧條件斷點(diǎn)實(shí)現(xiàn)步驟詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
CMD運(yùn)行Intellij Idea編譯后的class文件操作
這篇文章主要介紹了CMD運(yùn)行Intellij Idea編譯后的class文件操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
SpringBoot如何實(shí)現(xiàn)分離資源文件并打包
這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)分離資源文件并打包,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Spring?Security配置多個(gè)數(shù)據(jù)源并添加登錄驗(yàn)證碼的實(shí)例代碼
這篇文章主要介紹了Spring?Security配置多個(gè)數(shù)據(jù)源并添加登錄驗(yàn)證碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
idea啟動(dòng)tomcat控制臺中文亂碼的三種情況解決
本文主要介紹了idea啟動(dòng)tomcat控制臺中文亂碼,主要包括三種情況,分別介紹了一下解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
Spring Boot高級教程之Spring Boot連接MySql數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了Spring Boot高級教程之Spring Boot連接MySql數(shù)據(jù)庫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
SpringBoot使用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

