【Nacos案例】
创始人
2024-02-03 21:21:16
0

0、整体

整体项目概览

整体服务概览

在这里插入图片描述

1、新建父工程demo-nacos

删除src ,切记 packaging:pom


4.0.0spring-boot-dependenciesorg.springframework.boot2.3.2.RELEASEpomcom.exampledemo-nacos0.0.1-SNAPSHOTdemo-nacosdemo-nacos11112.2.5.RELEASEHoxton.SR8org.springframework.cloudspring-cloud-dependencies${springcloud.version}pomimportcom.alibaba.cloudspring-cloud-alibaba-dependencies${alibaba-cloud.version}pomimportorg.apache.commonscommons-lang3com.alibabafastjson2.0.19org.springframework.bootspring-boot-maven-plugin

2、新建通用模块demo-nacos-common


4.0.0demo-nacoscom.example0.0.1-SNAPSHOTcom.exampledemo-nacos-common0.0.1-SNAPSHOTdemo-nacos-commondemo-nacos-common1111org.projectlomboklombokorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testorg.springframework.bootspring-boot-maven-plugintrue  

添加响应web实体类:

package com.example.demonacoscommon.entity;import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;/*** 类描述: 返回前端的消息封装** @author Administrator*/
@Data
@AllArgsConstructor
public class RestApiResponse implements Serializable {private static final long serialVersionUID = 1L;private static final String DEFAULT_MSG_SUC = "成功";private Object data;private String message;private int status;public Map toMap() {Map map = new HashMap<>();if (data != null) {map.put("data", this.getData());}if (message != null) {map.put("message", this.getMessage());}map.put("code", this.getStatus());return map;}protected RestApiResponse() {super();}protected RestApiResponse(Object data) {this.setStatus(200);this.data = data;}protected RestApiResponse(int code, Object data) {this.setStatus(code);this.message = DEFAULT_MSG_SUC;this.data = data;}public Object getData() {return data;}public RestApiResponse setData(Object data) {this.data = data;return this;}@Overridepublic String toString() {return JSON.toJSONStringWithDateFormat(this, "yyyy-MM-dd HH:mm:ss");}public static RestApiResponse fromJson(String json) {return JSON.parseObject(json, RestApiResponse.class);}public String getMessage() {return message;}@SuppressWarnings("rawtypes")public RestApiResponse setMessage(String message) {this.message = message;return this;}@SuppressWarnings("rawtypes")public static RestApiResponse ok() {return ok(null);}@SuppressWarnings("rawtypes")public static RestApiResponse ok(Object data) {return new RestApiResponse(200, data);}@SuppressWarnings("rawtypes")public static RestApiResponse error(String message) {return new RestApiResponse(500, null).setMessage(message);}@SuppressWarnings("rawtypes")public static RestApiResponse error(String message, int status) {return new RestApiResponse().setStatus(status).setMessage(message);}@SuppressWarnings("rawtypes")public static RestApiResponse error(String message, int status, Object data) {return new RestApiResponse(data).setStatus(status).setMessage(message);}@SuppressWarnings("rawtypes")public static RestApiResponse error(ResultStatus resultStatus) {return new RestApiResponse().setStatus(resultStatus.getCode()).setMessage(resultStatus.getMessage());}public int getStatus() {return status;}@SuppressWarnings("rawtypes")public RestApiResponse setStatus(int status) {this.status = status;return this;}
}

自定义请求状态码:

package com.example.demonacoscommon.entity;/*** 类描述:自定义请求状态码*/
public enum ResultStatus {USERNAME_OR_PASSWORD_ERROR(-1001, "用户名或密码错误"),USER_NOT_FOUND(-1002, "用户不存在"),USER_NOT_LOGIN(-1003, "用户未登录"),/**************** 修改密码 (-8000) ***************************/MODIFY_PASSWORD_SUCCESS(-8001, "密码修改成功!"),MODIFY_PASSWORD_FAIL(-8002, "密码修改失败!"),MODIFY_PASSWORD_NULL(-8003, "旧密码为空或者旧密码填写不正确!"),/**************** 参数 (-10000) ***************************/PARAM_NULL(100001, "参数不能为空"),PARAM_INCORRECT(100002, "参数不正确"),PC_CURRENT_ACTIVITY_CODE(100003, "节点不能为空"),/**************** 异常(90001) ***************************/CODE_EXCEPTION(90001, "代码异常");/*** 返回码*/private int code;/*** 返回结果描述*/private String message;ResultStatus(int code, String message) {this.code = code;this.message = message;}public int getCode() {return code;}public String getMessage() {return message;}
}

实体类:最好手动加上getter、setter

package com.example.demonacoscommon.entity;import lombok.Data;
import lombok.NoArgsConstructor;/*** @author Administrator*/
@Data
public class User {private Integer id;private String name;private String money;public User() {}public User(Integer id, String name, String money) {this.id = id;this.name = name;this.money = money;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getMoney() {return money;}public void setMoney(String money) {this.money = money;}
}

3、生产者模块demo-nacos-provider


4.0.0demo-nacoscom.example0.0.1-SNAPSHOTcom.exampledemo-nacos-provider0.0.1-SNAPSHOTdemo-nacos-providerdemo-nacos-provider1111com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discoveryorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-actuatorcom.exampledemo-nacos-common0.0.1-SNAPSHOTorg.springframework.bootspring-boot-starter-testorg.projectlomboklomboktrue

application.yml

server:port: ${port:9001}spring:application:name: provider-servicecloud:nacos:discovery:server-addr: localhost:8848namespace: 3fcf3501-1f2e-46e7-8bb0-501c1b3f9db3
#  jackson:
#    serialization:
#      FAIL_ON_EMPTY_BEANS: false

启动类加注解:

package com.example.demonacosprovider;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient  // nacos客户端注解
public class DemoNacosProviderApplication {public static void main(String[] args) {SpringApplication.run(DemoNacosProviderApplication.class, args);}}

新建controller:

package com.example.demonacosprovider.controller;import com.example.demonacoscommon.entity.User;
import com.example.demonacoscommon.entity.RestApiResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;/*** @author Administrator*/
@RestController
@RequestMapping("/provider")
@Slf4j
public class ProviderController {public static HashMap users = new HashMap<>(6);static {users.put(1, new User(1, "冷风扇1号", "111"));users.put(2, new User(2, "冷风扇2号", "222"));users.put(3, new User(3, "冷风扇3号", "333"));users.put(4, new User(4, "冷风扇4号", "444"));users.put(5, new User(5, "冷风扇5号", "555"));users.put(6, new User(6, "冷风扇6号", "666"));}@Value("${server.port}")private String serverPort;@GetMapping("/get")public RestApiResponse executePay(@RequestParam("userId") Integer userId) {System.out.println("come in provider service port: " + serverPort);Map resultMap = new HashMap(1);resultMap.put(serverPort, users.get(userId));return RestApiResponse.ok(resultMap);}}

启动服务:允许多个实例(测试nacos的负载均衡):以及第二个启动的add vm options加上 -Dport=9002
在这里插入图片描述在这里插入图片描述可看到:
在这里插入图片描述

4、消费者模块demo-nacos-consumer


4.0.0demo-nacoscom.example0.0.1-SNAPSHOTcom.exampledemo-nacos-consumer0.0.1-SNAPSHOTdemo-nacos-consumerdemo-nacos-consumer1111com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discoveryorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-actuatorcom.exampledemo-nacos-common0.0.1-SNAPSHOTorg.springframework.bootspring-boot-starter-testorg.projectlomboklomboktrue

application.yml:

server:port: ${port:9101}
spring:application:name: consumer-servicecloud:nacos:discovery:server-addr: localhost:8848namespace: 3fcf3501-1f2e-46e7-8bb0-501c1b3f9db3
toserver:name: http://provider-service

启动类加注解:@EnableDiscoveryClient
负载均衡配置:

package com.example.demonacosconsumer.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/*** @author Administrator*/
@Configuration
public class RibbonConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}

新建controller:

package com.example.demonacosconsumer.controller;import com.example.demonacoscommon.entity.RestApiResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
@RequestMapping("/consumer")
public class ConsumerController {@Value("${toserver.name}")private String toServerName;@Autowiredprivate RestTemplate restTemplate;@GetMapping("/get/{userId}")public RestApiResponse consumer(@PathVariable("userId") Integer userId) {return restTemplate.getForObject(toServerName + "/provider/get?userId=" + userId, RestApiResponse.class, userId);}} 

启动:访问接口 http://localhost:9101/consumer/get/1
在这里插入图片描述刷新:
在这里插入图片描述

5、通过feign调用provider:

新建模块 demo-nacos-consumer-feign:


4.0.0demo-nacoscom.example0.0.1-SNAPSHOTcom.exampledemo-nacos-consumer-feign0.0.1-SNAPSHOTdemo-nacos-consumer-feigndemo-nacos-consumer-feign1111com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discoveryorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-actuatorcom.exampledemo-nacos-common0.0.1-SNAPSHOTorg.springframework.bootspring-boot-starter-testorg.projectlomboklomboktrueorg.springframework.cloudspring-cloud-starter-openfeign

application.yml:

server:port: ${port:9101}
spring:application:name: consumer-servicecloud:nacos:discovery:server-addr: localhost:8848namespace: 3fcf3501-1f2e-46e7-8bb0-501c1b3f9db3
#toserver:
#  name: http://provider-service

启动类加注解:@EnableDiscoveryClient
@EnableFeignClients

负载均衡配置类:

package com.example.demonacosconsumerfeign.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/*** @author Administrator*/
@Configuration
public class RibbonConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}

service:

package com.example.demonacosconsumerfeign.service;import com.example.demonacoscommon.entity.RestApiResponse;
import com.example.demonacoscommon.entity.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;@FeignClient(value = "provider-service")
public interface ProviderService {@GetMapping("/provider/get")RestApiResponse executeProvider(@RequestParam("userId") Integer userId);}

controller:

package com.example.demonacosconsumerfeign.controller;import com.example.demonacoscommon.entity.RestApiResponse;
import com.example.demonacoscommon.entity.User;
import com.example.demonacosconsumerfeign.service.ProviderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/consumer")
public class ConsumerController {@Autowiredprivate ProviderService providerService;@GetMapping("/get/{userId}")public RestApiResponse consumer(@PathVariable("userId") Integer userId) {return providerService.executeProvider(userId);}}

命名空间:
在这里插入图片描述

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...