nacos入门案例
一 确认版本
springboot的版本查看地址:https://spring.io/projects/spring-boot#learn
springcloud的版本查看地址:https://spring.io/projects/spring-cloud#overview
详细版本对应信息查看:https://start.spring.io/actuator/info
使用SpringCloud-alibab版本的确定方式:
通过查看springcloud alibaba 官网确定https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明
最终决定(版本号记忆):
springcloud-alibaba: 2.2.5.RELEASE
springcloud: Hoxton.SR8
springboot: 2.3.2.RELEASE
二 创建父工程
第一步
新建maven项目cloud-demo,因为父工程主要是用来确定版本,所以删掉src目录
第二步
写pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.qf</groupId>
    <artifactId>cloud-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </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>
    <!--    这是依赖管理,不是依赖,所以右侧maven没有dependency-->
    <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>
</project>
创建服务提供者
第一步
新建项目cloud-goods
第二步
修改pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud-demo</artifactId>
        <groupId>com.qf</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud-goods</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <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>
</project>
第三步
写配置文件application.yml
spring:
  application:
    name: cloud-goods   #服务名称,必须,唯一
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  #指定nacos-server的地址
        username: nacos
        password: nacos
server:
  port: 9001   #端口号
第四步
写启动类
添加注解@EnableDiscoveryClient //开关,开启服务的注册与发现功能(springcloud提供的)
package com.qf;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient   //开关,开启服务的注册与发现功能
public class GoodsApp {
    public static void main(String[] args) {
        SpringApplication.run(GoodsApp.class,args);
    }
}
第五步启动
打开nacos查看是否完成注册
创建新模块
第一步
创建项目cloud-entity
第二步
修改pom文件,添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud-demo</artifactId>
        <groupId>com.qf</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud-entity</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>
第三步
创建实体类
package com.qf;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Goods {
    private String goodsName;
    private double price;
}
第四步
修改cloud-goods的pom文件,添加依赖
<dependency>
    <groupId>com.qf</groupId>
    <artifactId>cloud-entity</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
第五步
在cloud-goods中新建controller
package com.qf.controller;
import com.qf.Goods;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("goods")
public class GoodsController {
    
    @RequestMapping("findById/{id}")
    public Goods findById(@PathVariable String id) {
        System.out.println("id" + id);
        return new Goods("小米", 99);
    }
}
创建服务消费者
第一步
创建项目cloud-order
第二步
修改pom文件,复制cloud-goods的即可
<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>
</dependencies>
第三步
写配置文件
spring:
  application:
    name: cloud-order   #服务名称,必须,唯一
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  #指定nacos-server的地址
        username: nacos
        password: nacos
server:
  port: 9002   #端口号
第四步
启动类
package com.qf;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class OrderApp {
    public static void main(String[] args) {
        SpringApplication.run(OrderApp.class, args);
    }
}
第五步启动
查看nacos是否注册成功
实现远程调用
第一步
在order启动类加个类 RestTemplate
package com.qf;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class OrderApp {
    public static void main(String[] args) {
        SpringApplication.run(OrderApp.class, args);
    }
    @Bean
    public RestTemplate initRestTemplate(){
        return  new RestTemplate();
    }
}
第二步
在order消费者新建个controller
package com.qf.controller;
import com.qf.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("order")
public class OrderController {
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/save")
    public Map save() {
        //远程调用cloud-good服务,获取goods信息,发送http请求(httpclient-java)=> resttemplate-spring提供
        String url = "http://localhost:9001/goods/findById/1";
        Goods goods = restTemplate.getForObject(url, Goods.class);
        System.out.println(goods);
        //2.保存订单
        System.out.println("保存成功");
        return new HashMap() {
            {
                put("code", "200");
                put("msg", "success");
            }
        };
    }
}
第三步启动
启动goods 和order 并且启动nacos
访问http://localhost:9002/order/save ,查看是否访问成功
优化
在OrderController中地址不能写死,应写服务名称
package com.qf.controller;
import com.qf.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("order")
public class OrderController {
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/save")
    public Map save() {
        //远程调用cloud-good服务,获取goods信息,发送http请求(httpclient)=> resttemplate
        String serverName ="cloud-goods";
        String url = "http://"+serverName+"/goods/findById/1";
        Goods goods = restTemplate.getForObject(url, Goods.class);
        System.out.println(goods);
        //2.保存订单
        System.out.println("保存成功");
        return new HashMap() {
            {
                put("code", "200");
                put("msg", "success");
            }
        };
    }
}
访问结果报错,因为发送请求需要通过cloud-goods去注册中心拿实例列表,这个事情需要由Ribbon完成,但是Ribbon没生效。需要在order启动类里RestTemplate上加个注解@LoadBalanced,springcloud提供的一个注解。
 
  