您好,登錄后才能下訂單哦!
這篇文章主要講解了“Nacos的作用是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Nacos的作用是什么”吧!
在講注冊中心內容時,我們已經知道Nacos本質上是一個服務,那么,是服務就會有接口,下面阿鑒給大家介紹一下注冊實例接口
更多OpenAPI可查看Nacos官網:https://nacos.io/zh-cn/docs/open-api.html
接口:/nacos/v1/ns/instance
請求方式:POST
參數:
名稱 | 類型 | 是否必選 | 描述 |
---|---|---|---|
ip | 字符串 | 是 | 服務實例IP |
port | int | 是 | 服務實例port |
namespaceId | 字符串 | 否 | 命名空間ID |
weight | double | 否 | 權重 |
enabled | boolean | 否 | 是否上線 |
healthy | boolean | 否 | 是否健康 |
metadata | 字符串 | 否 | 擴展信息 |
clusterName | 字符串 | 否 | 集群名 |
serviceName | 字符串 | 是 | 服務名 |
groupName | 字符串 | 否 | 分組名 |
ephemeral | boolean | 否 | 是否臨時實例 |
測試:
發送一個curl請求,當然使用Postman也可以
curl -i -X POST \ -H "Content-Type:application/json" \ 'http://192.168.2.11:8850/nacos/v1/ns/instance?serviceName=test&ip=123.123.123.123&port=8081&username=nacos&password=nacos'
打開Nacos控制臺查看效果
由于只傳了必要參數,所以命名空間和分組名稱都是默認的。
注意:由于我們只注冊了實例,并未定時發送心跳,所以實例會在一定時間內被Nacos剔除
打開詳情
ip和端口號即為我們填入的信息
相信小伙伴已經發現了,我們在調用接口時傳入的參數是什么,注冊到Nacos上的實例信息就是什么,那么在實際項目中能不能也這樣玩呢?
在之前我們使用Nacos時,我們使用的配置是這樣:
server: port: 8080 spring: application: name: my-order cloud: nacos: discovery: server-addr: 192.168.2.11:8850 username: nacos password: nacos
此時我們并未使用ip和port配置,Nacos將自動發現本地ip地址進行注冊, port則使用
server.port
現在我們將ip
和port
加上
server: port: 8080 spring: application: name: my-order cloud: nacos: discovery: server-addr: 192.168.2.11:8850 ip: 123.123.123.123 port: 1234 username: nacos password: nacos
但實際上我本機ip地址為192.168.65.91
啟動服務并在控制臺查看服務詳情
此時IP和端口就成了我們實際配置了的
心急的小伙伴這時候可能就會給阿鑒個大嘴巴子:講那么多,這有啥用?!
阿鑒:不急不急
在實際項目使用時,我們肯定傾向于讓服務自己發現IP和端口號進行注冊。
多實例部署時,誰關心你的本機ip是個啥,一個服務一會在那臺機器,一會在這臺機器,不可能每次部署時都改下配置。
但是有一種情況讓Nacos自己發現IP是不可行的。那就是使用容器部署服務。
比如我們在192.168.2.11
的服務器上部署一個my-goods
服務,此時Nacos自動發現的IP實際上是容器內部IP,如172.19.0.16
現在嘗試使用在192.168.2.12
的服務器上的my-order
服務,對my-goods
服務進行調用,此時會收到一個拒絕連接錯誤,因為調用的地址是172.19.0.16
,但實際需要的地址是192.168.2.11
簡單的辦法就是在配置文件中加上ip的配置,如
server: port: 8081 spring: application: name: my-goods cloud: nacos: discovery: server-addr: 192.168.2.11:8850 ip: 192.168.2.11 username: nacos password: nacos
此時my-goods注冊到Nacos上的地址就是服務器的地址了。
但是這種方式有個很明顯的弊端,就是服務遷移時需要改動配置,多實例部署時需要頻繁改動配置。
我們把配置改成如下:
server: port: 8081 spring: application: name: my-goods cloud: nacos: discovery: server-addr: 192.168.2.11:8850 ip: ${HOST_IP_ADDRESS:127.0.0.1} username: nacos password: nacos
此時ip配置中增加了變量:HOST_IP_ADDRESS
docker-compose.yaml
version: '3.5' services: my-goods: restart: always image: my-goods container_name: my-goods environment: HOST_IP_ADDRESS: $HOST_IP_ADDRESS TZ: Asia/Shanghai ports: - 8081:8081
在執行docker-compose
前,將HOST_IP_ADDRESS
輸出到環境變量中
export HOST_IP_ADDRESS=$(ifconfig eth0 | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | awk '{ print $2 }'| cut -f2 -"d:")
這行命令表示將本機ip輸出到環境變量
HOST_IP_ADDRESS
中這個步驟可根據不同的部署工具進行執行,比如阿鑒用的是gitlab-ci,就是在gitlab-ci中執行的。
如此,使用容器部署的方式便優雅完成了~
當我們發現了奧秘:只要我們配了IP,配的IP是啥,注冊到Nacos的IP就是啥。
掌握奇技淫巧的程序員們有沒有想到一些騷操作呢?阿鑒這里卻是想到了一個哦~
<img src="https://notes.zijiancode.cn/nacos/my-sidecar.png" />
my-sidercar將my-integral的信息注冊到Nacos上
新建一個my-sidecar
服務,配置如下
server: port: 8082 spring: application: name: my-sidecar main: allow-bean-definition-overriding: true cloud: nacos: discovery: server-addr: 192.168.1.11:8850 namespace: public service: my-integral ip: 192.168.65.91 port: 8083 username: nacos password: nacos management: endpoints: web: exposure: include: "*"
注冊到Nacos的信息是
my-integral
服務的
新建一個Spring Boot my-integral
服務(注意不是SpringCloud服務,不集成Nacos),配置如下
server: port: 8083 spring: application: name: my-integral
spring.application.name 配置加不加無所謂
在my-integral
服務中編寫接口
@Slf4j @RestController @RequestMapping("/integral") public class IntegralController { @GetMapping("/remain") public String remain(){ log.info("積分服務被調用了"); Random random = new Random(); int i = random.nextInt(100); return "您當前的積分為:" + i; } }
啟動項目并打開控制臺
該信息是由my-sidecar注冊而來,而非my-integer所注冊的,因為my-integral并未集成Nacos
在my-order
編寫調用代碼
@RestController @RequestMapping("/order") public class OrderController { @Resource private RestTemplate restTemplate; @GetMapping("/integral") public String integral(){ String url = "http://my-integral/integral/remain"; return restTemplate.getForObject(url, String.class); } }
啟動my-order
測試
服務調用成功了
回顧一下我們做了什么:我們使用配置ip的奧秘將一個并未集成Nacos的my-integral
信息注冊到了Nacos上,然后通過my-order
成功發起了調用~
這樣做有什么意義呢?難道真就為了騷一把?不是的。
假設我們現在有這樣的需求,有一個老項目old-project
想要加入到微服務系統中,但是這個old-project
集成Nacos的成本過高,那么我們就可以使用這樣的方式了。
這樣的方式支持非Java語言哦~
這里阿鑒偷偷告訴大家,這個方式其實有個術語,叫做:邊車模式。
其實Nacos已經實現了邊車模式,集成方式非常簡單
在原Nacos項目(my-sidecar)中引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sidecar</artifactId> </dependency>
編寫配置
server: port: 8082 spring: application: name: my-sidecar main: allow-bean-definition-overriding: true cloud: nacos: discovery: server-addr: 192.168.1.11:8850 service: my-integral sidecar: ip: 127.0.0.1 port: 8083 health-check-url: http://127.0.0.1:8083/integral/health management: endpoints: web: exposure: include: "*"
ip:my-integral的IP
port: my-integral的端口
health-check-url: my-integral的健康檢查地址
在my-integral
服務中增加接口
@RestController @RequestMapping("/integral") public class IntegralController { @GetMapping("/health") public Map<String,String> health(){ Map<String, String> map = new HashMap<>(2); map.put("status", "UP"); return map; } }
返回的內容必須是:status: UP
測試
感謝各位的閱讀,以上就是“Nacos的作用是什么”的內容了,經過本文的學習后,相信大家對Nacos的作用是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。