Springcloud基础运用流程
1. 新建一个springboot工程
- 父工程不需要src文件夹
- 需要注意点:
- 一、spirngboot,springcloud和springcloudalibaba之间的版本确定
- 二、父工程只做依赖管理,也就是只有版本管理,depenencymanagement
- 三、springcloudalibaba是springcloud的子项目,依赖于springcloud
2. 创建服务提供者
- 明确思想:springcloud微服务架构中,每一个模块通过业务拆分,都是可以独立运行的,原来的单体结构的内部调用关系不成立,而模块之间仍然需要调用,也就是通讯,所以每个模块都需要提供一个接口来供其他模块调用访问
- pom.xml文件配置
<!-- 微服务基础依赖 -->
<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>
<!-- 服务注册与发现的场景依赖 -->
<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>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
- application.yml配置文件
需要指定:
- 服务的名称(application.name),一般来说与模块的名称一致即可
- 服务的端口号
- 注册的地址,即nacos的地址,连接nacos的用户名和密码,默认都是nacos
# 配置服务名称 ,一般与模块名一致
spring:
application:
name: cloud-goods
cloud:
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
#设置端口
server:
port: 9001
- 引导类上需要增加注解@EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class CloudGoodsApplication {
public static void main(String[] args) {
SpringApplication.run(CloudGoodsApplication.class, args);
}
}
站在nacos的立场上,每一个模块都需要向nacos注册和被其他模块发现,所以此注解意味着每一个模块都是nacos的客户端,而nacos作为服务端
- controller中提供接口
@RestController
@RequestMapping("goods")
public class GoodsController {
@RequestMapping("info/{id}")
public Goods info(@PathVariable Integer id) {
return new Goods(id,"小米");
}
}
controller层写法与之前一致,模块内部依然可以调用自己的service和dao层,在作为消费者时需要其他工具帮助模块间的通信,调用
3. 创建服务的消费者
- 明确思想: 所谓的服务的消费者就是调用nacos中已经注册过的服务的使用者,就如同之前单体结构中的controller层调用service层一样,只是换了一种形式,使用http协议借用第三方nacos来调用服务
- pom.xml配置(依赖:父工程——springboot,web起步依赖,springcloudalibaba中nacos的注册与发现,端点监控actuator)
<dependencies>
<!-- 每一个微服务都是一个独立的进程,需要提供接口http访问 -->
<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>
<!-- 服务注册与发现 -->
<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>0.0.1-SNAPSHOT</version>
</dependency>
- application.yml文件配置(与服务提供者相同)
# 配置服务模块名称
server:
port: 9002
spring:
application:
name: cloud-order
cloud:
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
- 引导类上增加注解@EnableDiscoveryClient(每一个springcloud的消费和提供服务类都需要加此注解)
@SpringBootApplication
@EnableDiscoveryClient
public class CloudOrderApplication {
public static void main(String[] args) {
SpringApplication.run(CloudOrderApplication.class, args);
}
@Bean
//让ribbon拦截RestTemplate发出的所有的请求
//ribbon获取url中的service name
//从 nacos 注册中心获取实例列表
//负责从实例列表中通过相应的负载均衡算法,获取一个实例
//RestTemplate请求实例
@LoadBalanced
public RestTemplate initRestTemplate(){
return new RestTemplate();
}
}
注意:
springcloud中的服务消费者中需要调用其他服务,就需要服务间通信,需要在引导类中配置RestTemplate来作为服务间通信的媒介
@LoadBalance表明通过负载均衡策略来获取实例
- 服务消费者的controller层
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("save")
public Map save() {
// 需要请求服务提供者的地址,不能硬编码,写成服务名
String url = "http://cloud-goods/goods/info/1";
//利用restTemplate发送请求
Goods goods = restTemplate.getForObject(url, Goods.class);
//ResponseEntity<Goods> forEntity = restTemplate.getForEntity(url, Goods.class);
System.out.println(goods);
// service层操作
return new HashMap(){{
put("code",200);
put("msg","success");
}};
}
}
注意点:
- url路径一定不能硬编码,要通过服务名来指定调用的服务
- 调用需要注入restTemplate对象,使用该对象来调用服务
- restTemplate的getForObject() 方法获取的是响应结果而getForEntity() 获得的是响应体