02-搭建微服务-服务注册与发现(Nacos)和远程调用(RestTemplate)

0、说明 

版本:版本选择

SpringBoot版本:2.3.2.RELEASE

spring-cloud版本:Hoxton.SR9

spring-cloud-alibaba版本:2.2.6.RELEASE

服务注册与发现:

Nacos

远程调用:

RestTemplate,是Spring中提供的发送http请求的客户端。


1、搭建父工程:shiory-cloud

 1、建项目 

新建一个maven工程,新建完父工程后,删除src目录,父工程结构

2、改pom.xml文件

pom.xml文件中锁定SpringBoot、SpringCloud、SpringCloud Alibaba的版本,加入以下内容。dependencyManagement标签是锁定版本,并不是真正的依赖。

    <!-- SpringBoot版本-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/>
    </parent>


    <properties>
        <!--JDK版本-->
        <java.version>1.8</java.version>
        <!--字符集编码-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <!--spring-cloud版本-->
        <spring.cloud-version>Hoxton.SR9</spring.cloud-version>
        <!--spring-cloud-alibaba版本-->
        <spring.cloud.alibaba-version>2.2.6.RELEASE</spring.cloud.alibaba-version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--spring-cloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring-cloud-alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <repositories>
        <repository>
            <id>aliyun</id>
            <name>aliyun Repository</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

如果SpringBoot版本报错,在pom文件中加入以下内容 

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/libs-snapshot</url>
        </repository>
    </repositories>
 
    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/libs-snapshot</url>
        </pluginRepository>
    </pluginRepositories>

2、提取公共模块:cloud-common

因为微服务项目中,会有很多服务,所以抽取公共部分建成一个模块Module



1、建Module

右键项目--New--Module,选择Maven项目,点击Next,选择父工程,输入模块名称,点击Finish



2、改pom.xml文件

添加如下依赖,其中Nacos场景依赖暂时是用于服务的注册与发现使用的,此处不用写版本,因为版本已经在父工程中锁定了

    <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>

3、新建application.yml文件

resources目录下新建application.yml文件,添加公共配置(nacos连接信息,用于服务注册与发现)

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos-server的地址
        username: nacos # nacos-server用户名
        password: nacos # nacos-server密码

4、新建主启动类

src/main/java中新建一个启动类,添加@EnableDiscoveryClient注解,开启服务注册与发现

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 
/**
 * =====================================================
 * 服务公共模块
 * @author 汐小旅Shiory
 * @date 2021/12/5 13:46
 * =====================================================
 */
@SpringBootApplication
@EnableDiscoveryClient // 服务注册与发现
public class CommonApplication {
    public static void main(String[] args) {
        SpringApplication.run(CommonApplication.class, args);
    }
 
}

5、项目结构


3、搭建服务提供者:cloud-demo1

 1、建Module

右键项目--New--Module,选择Maven项目,点击Next,选择父工程,输入模块名称,点击Finish



2、改pom.xml文件

添加刚才新建的公共模块依赖

    <dependencies>
        <!--公共模块依赖-->
        <dependency>
            <groupId>com.shiory</groupId>
            <artifactId>cloud-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

3、新建application.yml文件

resources目录下新建application.yml文件,并且添加服务名和端口,每个模块的服务名端口必须保证唯一

server:
  port: 7001 # 服务端口号,必须配置,保证唯一
spring:
  application:
    name: cloud-demo1 # 服务名称,必须配置,保证唯一

4、新建主启动类

src/main/java中新建一个启动类,和cloud-common一样,把启动类建在同一级目录一下,比如cloud-common的在com.shiory包下,那这个启动类就建在cloud-demo1的com.shiory包下

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
/**
 * =====================================================
 * 服务提供者
 * @author 汐小旅Shiory
 * @date 2021/12/5 13:55
 * =====================================================
 */
@SpringBootApplication
public class Demo1Application {
    public static void main(String[] args) {
        SpringApplication.run(Demo1Application.class, args);
    }
}

5、编写对外暴露的接口

也就是要被远程调用的接口:“/demo1/api/callTest

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * =====================================================
 * 服务提供者:对外暴露的接口
 * @author 汐小旅Shiory
 * @date 2021/12/5 14:31
 * =====================================================
 */
@RestController
@RequestMapping("/demo1/api")
public class Demo1ApiController {
 
    @GetMapping("/callTest")
    public String callTest(@RequestParam(name = "serverName") String serverName) {
        String result = "我是服务提供者,我被服务" + serverName + "调用了!";
        return result;
    }
}

6、项目结构

 


4、 搭建服务消费者:cloud-demo2

1、建Module

右键项目--New--Module,选择Maven项目,点击Next,选择父工程,输入模块名称,点击Finish



2、改pom.xml文件

添加刚才新建的公共模块依赖

    <dependencies>
        <dependency>
            <groupId>com.shiory</groupId>
            <artifactId>cloud-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

3、新建application.yml文件

resources目录下新建application.yml文件,并且添加服务名和端口,每个模块的服务名端口必须保证唯一

server:
  port: 7002 # 服务端口号,必须配置,保证唯一
spring:
  application:
    name: cloud-demo2 # 服务名称,必须配置,保证唯一

4、新建主启动类

src/main/java中新建一个启动类,不过需要在启动类中注入RestTemplate开启ribbon@LoadBalanced注解),和cloud-common一样,把启动类建在同一级目录一下,比如cloud-common的在com.shiory包下,那这个启动类就建在cloud-demo1的com.shiory包下

注入RestTemplate:实现远程调用

开启ribbon:使用服务提供者的服务名称调用时,将服务提供者的名称解析成真正的IP和端口

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * =====================================================
 * 服务消费者
 * @author 汐小旅Shiory
 * @date 2021/12/5 14:03
 * =====================================================
 */
@SpringBootApplication
public class Demo2Application {
    public static void main(String[] args) {
        SpringApplication.run(Demo2Application.class, args);
    }

    /**
     * 注入RestTemplate:实现远程调用 (由Spring提供)
     * 开启ribbon:将远程服务的名称解析成真正的IP和端口
     */
    @Bean // 注入RestTemplate
    @LoadBalanced // 开启ribbon
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

5、新建业务类(编写Controller)

编写controller(此处只是简单的新建一个Controller,真正的业务类包含Entity,Dao,Service,Controller)

在搭建服务提供者cloud-demo1时,得到以下消息:

服务名称:cloud-demo1

服务暴露的接口:/demo1/api/callTest

响应返回值类型:String

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
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;

/**
 * =====================================================
 *
 * @author 汐小旅Shiory
 * @date 2021/12/5 14:38
 * =====================================================
 */
@RestController
@RequestMapping("/demo2")
public class Demo2Controller {

    @Autowired
    private RestTemplate restTemplate;

    @Value("${spring.application.name}")
    private String serverName;

    /**
     * 使用RestTemplate发起请求远程调用
     * @return
     */
    @GetMapping("/remoteCall")
    public Map<String,Object> remoteCall() {

        // 远程服务名称
        String remoteServerName = "cloud-demo1";
        // 远程服务接口
        String remoteInter = "/demo1/api/callTest?serverName=" + serverName;
        // 拼接远程服务URL
        String remoteUrl = "http://" + remoteServerName + remoteInter;
        // 调用远程接口
        String remoteResult = restTemplate.getForObject(remoteUrl, String.class);

        Map<String, Object> map = new HashMap<>();
        map.put("remarks", "我是" + serverName + "服务,正在使用RestTemplate调用!");
        map.put("remoteResult", remoteResult);

        return map;
    }
}

 6、项目结构


5、测试

1、启动Nacos,在 《Windows下搭建Nacos服务》一文中提到

2、启动服务提供者cloud-demo1,以及服务消费者cloud-demo2

3、登录nacos,查看服务是否注册到Nacos

 

4、发起请求(请求cloud-demo2中的接口,cloud-demo2接口中远程调用cloud-demo1中的接口) 

http://localhost:7002/demo2/remoteCall

 至此,远程调用成功 !


6、小结

1、服务注册与发现(Nacos)

1.1、搭建nacos服务:Windows下搭建Nacos服务

1.2、pom.xml中添加依赖

        <!--Nacos场景依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

1.3、application.yml中配置nacos连接信息 

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos-server的地址
        username: nacos # nacos-server用户名
        password: nacos # nacos-server密码

1.4、启动类上加注解,开启服务注册与发现

@EnableDiscoveryClient // 服务注册与发现

2、远程调用(openfeign)

2.1、服务提供者

2.1.1、暴露接口

2.2、服务消费者 

2.2.1、启动类注入RestTemplate、开启ribbon

2.2.2、注入RestTemplate,发起远程调用 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值