创建父工程cloud-demo(maven)
版本确定:
nacos:1.4.1
springcloud-alibaba:2.2.5 RELEASE
springcloud: Hoxton.SR8
springboot: 2.3.2.RELEASE
在pom.xml添加相关版本管理
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath></relativePath>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
服务提供者
在父工程中创建一个模块cloud-goods(maven)
添加依赖:
<dependencies>
<!-- web场景依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 端点控制依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--nacos场景依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
创建核心配置文件:src/main/resources/application.yml
spring:
application:
name: cloud-goods #服务名称 必须有 保证唯一
cloud:
nacos:
discovery:
server-addr: localhost:8848 #指定nocas-server的地址
username: nacos
password: nacos
server:
port: 9001
在java文件夹中创建springboot入口类com.qf.GoodsApp
一定要加@EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient //开启服务注册与发现功能
public class GoodsApp {
public static void main(String[] args) {
SpringApplication.run(GoodsApp.class,args);
}
}
启动springboot后,会在nacos发现这个服务
创建实体类
创建新module cloud-entity(maven) 实体类
依赖:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
创建实体类Goods
在cloud-goods中引入实体类依赖:
写一个简单的controller
服务消费者
在父工程创建新的module cloud-order(maven) 订单
pom.xml
<parent>
<artifactId>cloud-demo</artifactId>
<groupId>com.qf</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-goods</artifactId>
<dependencies>
<!-- web场景依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 端点控制依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--nacos场景依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.qf</groupId>
<artifactId>cloud-entity</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.qf</groupId>
<artifactId>cloud-entity</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
application.yml:
spring:
application:
name: cloud-order #服务名称 必须有 保证唯一
cloud:
nacos:
discovery:
server-addr: localhost:8848 #指定nocas-server的地址
username: nacos
password: nacos
server:
port: 9002
OrderApp:
controller:
controller中save保存订单方法 需要发送http请求获取cloud-goods的服务 故需要resttemplate
在OrderApp中初始化restTemplate:
完成controller:
浏览器发送http请求,可以得到结果:
后端控制台也有响应数据:
此时还有一个问题,localhost:9002是硬编码 不利于修改维护
应该采用服务名的形式
但是此时直接用服务名是不被承认的,需要在启动类初始化restTemplate的地方添加注解:@LoadBalanced
该注解可以开启ribbon
resttemplate发送请求通过ribbon去获取服务实例列表,从而让cloud-goods被映射成localhost:9002
集群演示
搭建GoodsApp集群
此时application.yml里的端口需要修改 获取port参数 如果没有就用8080
controller里获取一下端口号
然后调用请求的时候打印一下
此时9001 9003是同一个集群
9002发送10次请求;
发现9001 9003轮换(轮询) @LoadBalanced开启了负载均衡
nacos领域模型
nacos的服务由三元组唯一确定 (namespace、group、servicename)
namespace:默认值为public
group:默认值为DEFAULT_GROUP
不同的namespace是相互隔离的,相同namespace但是不同group也是相互隔离的
微服务发现另外一个微服务,通过三元组去找服务
1.新建命名空间:
2.发布服务到指定命名空间
要想发布服务 首先要在application.yml里添加配置
cloud-goods的
cloud-order的
goods在测试环境 order在生产环境
再次发送save请求 发现报错 说明namespace生效 两个服务相互隔离