1. Nacos Docker 快速开始
操作步骤
Clone 项目
git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker
单机模式 Derby
docker-compose -f example/standalone-derby.yaml up
浏览器访问 IP:8848/nacos
密码和账号皆为 nacos
添加命名空间
2. 搭建注册中心
工程目录
父 pom.xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
</dependencies>
provider
pom.xml
<dependencies>
<!-- 注册中心依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
application.yml
server:
port: 8880
spring:
application:
# 服务器名
name: provider-server
cloud:
nacos:
discovery:
# 配置服务的名称 默认值 spring.application.name
# service:
# 配置注册中心的地址 如果是集群 使用,隔开
server-addr: "192.168.140.130:8848"
# 配置注册中心的命名空间 隔离环境的作用
# 注意 所有的应用必须注册在同一个命名空间下 默认是public
namespace: "b091994d-1518-4537-9ad6-290c821dd681"
# 如果注册中开启了 用户认证
username: ""
password: ""
控制类
@RestController
public class ProviderController {
@GetMapping("/hello")
public String hello() {
return "provider";
}
}
启动类
@SpringBootApplication
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class, args);
}
}
运行 ProviderApp 注册到 Nacos
consumer
原生 apache.http 调用 provider
pom.xml
<dependencies>
<!-- 注册中心依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
</dependencies>
application.yml
server:
port: 8881
spring:
application:
# 服务器名
name: consumer-server
cloud:
nacos:
discovery:
server-addr: "192.168.140.130:8848"
namespace: "b091994d-1518-4537-9ad6-290c821dd681"
service
@Service
public class ConsumerService {
public String test() {
return null;
}
}
controller
@RestController
public class ConsumerController {
@GetMapping("/")
public String test() throws IOException {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://localhost:8880/hello");
String str = httpClient.execute(httpGet, response -> {
HttpEntity entity = response.getEntity();
return !ObjectUtils.isEmpty(entity) ? EntityUtils.toString(entity) : null;
});
return "消费者数据 =====" + "提供者数据:" + str;
}
}
启动类
@SpringBootApplication
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class, args);
}
}
测试
feign调用provider
- consumer
pom.xml
<dependencies>
<!-- 注册中心依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
启动类 启动EnableFeignClients
@SpringBootApplication
//将feignClient接口注入到spring ioc
@EnableFeignClients
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class, args);
}
}
service
@Service
public class ConsumerServiceImpl implements ConsumerService {
@Resource
ProviderApi providerApi;
@Override
public String test() {
String hello = providerApi.hello();
return hello;
}
}
ProviderApi
/**
* 服务降级
*/
@FeignClient(name = "provider-server", path = "/api/provider")
public interface ProviderApi {
@GetMapping("/hello")
String hello();
}
application.yml
server:
port: 8881
spring:
application:
# 服务器名
name: consumer-server
cloud:
nacos:
discovery:
server-addr: "192.168.140.130:8848"
namespace: "e8ed52a0-6925-4735-88d9-570ed94e2891"
controller
@RestController
public class ConsumerController {
@Resource
ConsumerService consumerService;
@GetMapping("/")
public String test() throws IOException {
return "消费者数据 =====" + "提供者数据:" + consumerService.test();
}
}
- provider
pom.xml
<dependencies>
<!-- 注册中心依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
application.yml
server:
port: 8880
servlet:
context-path: "/api/"
spring:
application:
# 服务器名
name: provider-server
cloud:
nacos:
discovery:
# 配置服务的名称 默认值 spring.application.name
# service:
# 配置注册中心的地址 如果是集群 使用,隔开
server-addr: "192.168.140.130:8848"
# 配置注册中心的命名空间 隔离环境的作用
# 注意 所有的应用必须注册在同一个命名空间下 默认是public
namespace: "e8ed52a0-6925-4735-88d9-570ed94e2891"
# 如果注册中开启了 用户认证
username: ""
password: ""
controller
@RestController
@RequestMapping("/provider")
public class ProviderController {
@GetMapping("/hello")
public String hello() {
return "provider";
}
}
启动类
@SpringBootApplication
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class, args);
}
}
启动 测试