赞
踩
<!-- 微服务基础依赖 --> <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.name),一般来说与模块的名称一致即可
- 服务的端口号
- 注册的地址,即nacos的地址,连接nacos的用户名和密码,默认都是nacos
# 配置服务名称 ,一般与模块名一致
spring:
application:
name: cloud-goods
cloud:
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
#设置端口
server:
port: 9001
@SpringBootApplication
@EnableDiscoveryClient
public class CloudGoodsApplication {
public static void main(String[] args) {
SpringApplication.run(CloudGoodsApplication.class, args);
}
}
站在nacos的立场上,每一个模块都需要向nacos注册和被其他模块发现,所以此注解意味着每一个模块都是nacos的客户端,而nacos作为服务端
@RestController
@RequestMapping("goods")
public class GoodsController {
@RequestMapping("info/{id}")
public Goods info(@PathVariable Integer id) {
return new Goods(id,"小米");
}
}
controller层写法与之前一致,模块内部依然可以调用自己的service和dao层,在作为消费者时需要其他工具帮助模块间的通信,调用
<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>
# 配置服务模块名称
server:
port: 9002
spring:
application:
name: cloud-order
cloud:
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
@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表明通过负载均衡策略来获取实例
@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() 获得的是响应体
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。