Nacos简介
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos其实就是一个注册中心,用来管理和注册微服务
搭建Nacos环境
安装nacos(版本1.1.4)
下载网址 https://github.com/alibaba/nacos/releases/tag/1.1.4
下载zip文件
下载本地解压缩
启动nacos
双击启动文件
发现启动不起来,根本没有反应
使用命令启动 startup.cmd也不行
解决问题
问题发现我的环境变量名叫JAVA_HOMO不叫JAVA_HOME 改过来之后重启发现已经解决成功
这时候命令启动也可以了
访问http://localhost:8848/nacos/#/login,出现以下页面代表成功
账号密码都是nacos 进行登录
Nacos实战入门
将商品微服务注册到nacos
修改shop-product商品微服务模块的代码,将其注册到nacos服务上
1 在pom里面引入nacos依赖
<!--nacos客户端依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2 在商品微服务shop-produc启动类添加@EnableDiscoveryClient注解
package com.wyh;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @program: springcloud-alibaba
* @description: Product启动类
* @author: 魏一鹤
* @createDate: 2022-05-01 23:00
**/
//开启nacos客户端注解
@EnableDiscoveryClient
@SpringBootApplication
public class ProductApplication {
public static void main(String[] args){
SpringApplication.run(ProductApplication.class);
}
}
3 在application.yml中添加nacos服务的地址
#端口server:
server:
port: 8081
#项目名称
spring:
application:
name: service-product
# 数据库
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop?serverTimezone=GMT&allowPublicKeyRetrieval=true&useSSL=false&characterEncoding=utf8
username: root
password: root
# jpa
jpa:
properties:
hibernate:
#jpa根据实体创建对应的数据库表.有的话就创建,没有的话就不创建
hbm2ddl:
auto: update
#索引方式
dialect: org.hibernate.dialect.MYSQL5InnoDBDialect
#配置nacos服务
cloud:
nacos:
discovery:
server-addr: localhost:8848
4 启动服务,观察nacos的控制面板上是否有注册上来的商品微服务
服务必须启动才能被注册进入nacos!
商品微服务已经注册到nacos
把订单的微服务也按照相同的步骤进行操作注册到nacos,代码都是一样的
重新启动订单服务,发现也已经被注册到nacos
通过Nacos DiscoveryClient 获取微服务信息进行调用
最后处理订单微服务通过nacos来获取商品微服务的地址,通过注入DiscoveryClient 获取某个具体微服务的信息
package com.wyh.controller;
import com.alibaba.fastjson.JSON;
import com.wyh.entity.Order;
import com.wyh.entity.Product;
import com.wyh.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
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;
import java.util.List;
/**
* @program: springcloud-alibaba
* @description: order controller
* @author: 魏一鹤
* @createDate: 2022-05-01 22:52
**/
@RestController
@Slf4j
public class OrderController {
@Autowired
private OrderService orderService;
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
//下单
@RequestMapping( "/order/prod/{pid}" )
public Order order(@PathVariable Integer pid) {
log.info( "接收到{}号商品的下单请求,接下来调用商品微服务查询此商品信息" ,pid);
//调用商品微服务查询商品信息
//使用用restTemplate调用商品微服务 有两个参数 url访问地址和返回值
//订单微服务通过nacos调用商品微服务
//获取商品微服务实例,参数就是nacos客户端服务列表的服务名
List<ServiceInstance> instances = discoveryClient.getInstances( "service-product" );
//获取商品微服务
ServiceInstance serviceInstance = instances.get(0);
//获取商品微服务地址
String host = serviceInstance.getHost();
//获取商品微服务端口
int port = serviceInstance.getPort();
//把获取到商品微服务的地址+端口进行嵌入
Product product = restTemplate.getForObject( "http://" +host+ ":" +port+ "/product/" + pid, Product.class);
log.info( "查询到{}号商品信息,内容是{}" ,pid, JSON.toJSONString(product));
//组装order订单信息
Order order=new Order();
//用户信息 模拟即可
order.setUid(1);
order.setUsername( "测试用户" );
//商品信息 从查询到的product中获取
order.setPid(pid);
order.setPname(product.getPname());
order.setPprice(product.getPprice());
//购买数量 模拟即可
order.setNumber(1);
//下单 创建订单信息
orderService.createOrder(order);
log.info( "创建信息成功,订单信息为:{}" ,JSON.toJSONString(order));
return order;
}
}
通过debug的方式发现请求路径拼接没问题
测试结果,没有问题,下单成功