删除src ,切记 packaging:pom
4.0.0 spring-boot-dependencies org.springframework.boot 2.3.2.RELEASE pom com.example demo-nacos 0.0.1-SNAPSHOT demo-nacos demo-nacos 11 11 2.2.5.RELEASE Hoxton.SR8 org.springframework.cloud spring-cloud-dependencies ${springcloud.version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies ${alibaba-cloud.version} pom import org.apache.commons commons-lang3 com.alibaba fastjson 2.0.19 org.springframework.boot spring-boot-maven-plugin
4.0.0 demo-nacos com.example 0.0.1-SNAPSHOT com.example demo-nacos-common 0.0.1-SNAPSHOT demo-nacos-common demo-nacos-common 11 11 org.projectlombok lombok org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test org.springframework.boot spring-boot-maven-plugin true
添加响应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;}
}
4.0.0 demo-nacos com.example 0.0.1-SNAPSHOT com.example demo-nacos-provider 0.0.1-SNAPSHOT demo-nacos-provider demo-nacos-provider 11 11 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator com.example demo-nacos-common 0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-test org.projectlombok lombok true
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.0.0 demo-nacos com.example 0.0.1-SNAPSHOT com.example demo-nacos-consumer 0.0.1-SNAPSHOT demo-nacos-consumer demo-nacos-consumer 11 11 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator com.example demo-nacos-common 0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-test org.projectlombok lombok true
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
启动:访问接口 http://localhost:9101/consumer/get/1
刷新:
新建模块 demo-nacos-consumer-feign:
4.0.0 demo-nacos com.example 0.0.1-SNAPSHOT com.example demo-nacos-consumer-feign 0.0.1-SNAPSHOT demo-nacos-consumer-feign demo-nacos-consumer-feign 11 11 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator com.example demo-nacos-common 0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-test org.projectlombok lombok true org.springframework.cloud spring-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);}}
命名空间: