使用Springboot+Nacos搭建微服务架构以及微服务之间调用

目录

1、首先需要搭建Nacos-server

nacos搭建环境要求

nacos-server下载方式

nacos-server启动

2.搭建服务注册发现和nacos-config配置中心

服务注册发现

config配置中心

3、微服务调用


需求:业务量升级,老大要求使用nacos微服务架构,技研玩了一下,从搭建到使用一整套流程


1、首先需要搭建Nacos-server

nacos搭建环境要求,如下:

  1. 64位操作系统,支持 Linux/Unix/Mac/Windows
  2. 64 位 JDK 1.8+
  3. Maven 3.2.x+
  4. 目前Spring Boot需要 2.2.0.RELEASE---2.3.0.M1之间的版本 支持nacos

环境变量Java_home,maven_home自行配置,笔者就不在此处赘述

nacos-server下载方式

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/

// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

 笔者当前用的 nacos-server-1.2.1.tar.gz 这个版本,release 1.3.0 beta还处于beta版本且下载很慢,推荐使用nacos-server-1.2.1.tar.gz (linux) 或者 nacos-server-1.2.1.zip(windows)版本

nacos-server启动

linux启动命令:sh startup.sh -m standalone

windos启动命令:startup.cmd 

默认的登录名nacos 密码 nacos,登录后UI页面如下,还是挺带劲的

使用Springboot+Nacos搭建微服务架构以及微服务之间调用_第1张图片

如果想修改端口号和context,可以在nacos\distribution\conf目录下找到application.properties文件修改

server.servlet.contextPath=/nacos
### Default web server port:
server.port=8848 

如果想修改登录名和密码,可以在同目录下的application.properties.example文件进行修改

而且nacos是支持mysql和adb进行数据持久化的


2.搭建服务注册发现和nacos-config配置中心

服务注册发现

provider的pom依赖:


   1.8
   2.2.1.RELEASE


   
      
         com.alibaba.cloud
         spring-cloud-alibaba-dependencies
         ${spring-cloud-alibaba.version}
         pom
         import
      
   



   org.springframework.boot
   spring-boot-starter-web


   com.alibaba.cloud
   spring-cloud-starter-alibaba-nacos-config


   com.alibaba.cloud
   spring-cloud-starter-alibaba-nacos-discovery

application.properties配置信息:

## 服务提供者server provider
server.port=8070
spring.application.name=service-provider
##nacos注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#允许其他服务通过注册中心发现该服务#
eureka.instance.prefer-ip-address= true

在启动类上添加注解 @EnableDiscoveryClient,就会向nacos-server注册服务
@SpringBootApplication
@EnableDiscoveryClient
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }

}

至此生产者provider就此搭建起来了

consumer的pom依赖:


   1.8
   2.2.1.RELEASE

   
      
         com.alibaba.cloud
         spring-cloud-alibaba-dependencies
         ${spring-cloud-alibaba.version}
         pom
         import
      
   

   org.springframework.boot
   spring-boot-starter-web


   com.alibaba.cloud
   spring-cloud-starter-alibaba-nacos-config


   com.alibaba.cloud
   spring-cloud-starter-alibaba-nacos-discovery

同provider的依赖是一样一样的

application.properties配置信息:

server.port=8111
spring.application.name=service-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
在启动类上添加注解 @EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerStartApplication {
   public static void main(String[] args) {
      SpringApplication.run(ConsumerStartApplication.class, args);
   }
}

启动起来了,success!!! 如下

使用Springboot+Nacos搭建微服务架构以及微服务之间调用_第2张图片

config配置中心

config的pom依赖:


   1.8
   2.2.1.RELEASE

   
      
         com.alibaba.cloud
         spring-cloud-alibaba-dependencies
         ${spring-cloud-alibaba.version}
         pom
         import
      
   

   org.springframework.boot
   spring-boot-starter-web


   org.springframework.boot
   spring-boot-starter-actuator


   org.springframework.cloud
   spring-cloud-starter-alibaba-nacos-config
   0.2.1.RELEASE

properties配置文件分优先级bootstrap.properties最高,项目启动就要向nacos-server拉取配置数据

bootstrap.properties配置内容

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=nacos-config
spring.cloud.nacos.config.file-extension=properties
management.endpoints.web.exposure.include=*

application.properties配置内容:

spring.profiles.active=dev
server.port=8100

配置中心需要自己写一个读取配置类,

这个类可以从配置中心读取已经配置的属性,@RefreshScope支持动态读取,配置中心更改配置信息后,可以通过这个注解自动刷新,然后通过/actuator/refresh刷新后即可获取(适合节点较少),如果集群节点太多,可以引入spring-cloud-bus服务总线,进行集群同步,通过/actuator/bus_refresh 即可将所有节点同步,就不用重启服务器了,否则运维会拿着10米长大砍刀来砍死你

@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${useLocalCache}")
    private String useLocalCache;

    @RequestMapping("/get")
    public String get() {
        return useLocalCache;
    }
}

启动类:

@SpringBootApplication
public class NacosConfigApplication {
   public static void main(String[] args) {
      SpringApplication.run(NacosConfigApplication.class, args);
   }
}

try一下:在配置中心配置下

使用Springboot+Nacos搭建微服务架构以及微服务之间调用_第3张图片

 

接口读取一下:

使用Springboot+Nacos搭建微服务架构以及微服务之间调用_第4张图片

在nacos-server配置中心更改下,不重启服务

使用Springboot+Nacos搭建微服务架构以及微服务之间调用_第5张图片

调用/actuator/refresh自动刷新

使用Springboot+Nacos搭建微服务架构以及微服务之间调用_第6张图片

返回值,他会给你哪些key发生了变化,真好!这个可以支持我们局部更新配置属性,不用全量更新了

然后调一下配置读取接口

使用Springboot+Nacos搭建微服务架构以及微服务之间调用_第7张图片

配置中心的demo over...


3、微服务调用

在这里笔者演示RestTemplate和OpenFeign两种方式

使用RestTemplate进行远程请求

需要初始化restTemplate模板 @LoadBalanced实现了ribbon负载均衡

@Configuration
@Slf4j
public class BeanConfig {

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate(){
        log.info("初始化restTemplate模板...");
        return new RestTemplate();
    }
}
使用demo,需要配置url,入参,返回类型,当然这个需要自己设定好,或者和他人配合约定好
@RestController
@RequestMapping(value = "/service-inlet")
public class NacosConsumerController {
    @Autowired
    private RestTemplate restTemplate;
    private static final String URL_PREFIX="http://service-provider";

    @RequestMapping("/getList")
    public List getList(){
       return this.restTemplate.postForObject(URL_PREFIX+"/getUserList",null,List.class);
    }
}

然后在服务提供方provider写一个对应的服务接口

@RestController
@Slf4j
public class NacosProviderController {

    @RequestMapping(value="/getUserList")
    public List getUserList(){
        log.info("开始调用start");
        List result=new ArrayList<>();
        result.add("test1");
        result.add("test2");
        result.add("test3");
        result.add("test4");
        result.add("test5");
        result.add("test6");
        log.info("调用end");
        return  result;
    }
}

然后启动服务提供者和服务消费者,看效果

使用Springboot+Nacos搭建微服务架构以及微服务之间调用_第8张图片

可以,序列化他已经帮你做了!!

使用OpenFeign进行远程请求

需要在上面的consumer上面增加feign依赖


   org.springframework.cloud
   spring-cloud-starter-openfeign
   2.2.3.RELEASE

消费者调用使用FeignClient,需要做的就是自己要写一下接口,比RestTemplate工作量要稍微大一点,但是更服务Java的架构思想,各有优劣点,自行选择

@RestController
@RequestMapping(value = "/service-inlet")
public class NacosConsumerController {
    
    @Autowired
    private UserApi UserApi;

    @RequestMapping("/getFeignList")
    public List getFeignList(){
        return this.UserApi.getFeignList();
    }
}

Feign的方式额外多写个 UserApi 类,FeignClient注解就是表明这个类都要发http请求,value是注册中心的服务提供方的application-name

@FeignClient(value="service-provider")
public interface UserApi {

    @RequestMapping(value = "/getUserList",method = RequestMethod.POST)
    List getFeignList();
}
最后在启动类上添加@EnableFeignClients,标注这是一个Feign客户端

@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerStartApplication {
   public static void main(String[] args) {
      SpringApplication.run(ConsumerStartApplication.class, args);
   }
}

启动后,再调用接口查看下使用Feign的效果

使用Springboot+Nacos搭建微服务架构以及微服务之间调用_第9张图片

也好使!!

两者的优缺点:

RestTemplate:优点-->代码不用冗余写中间接口,易读,缺点--> 代码不优雅,还需要写url
Feign:优点-->代码优雅,一如既往的像之前的那种service和serviceImpl(此时在provider工程里实现的)缺点-->需要额外写中间接口

至此对nacos的技术预研告一段落,相比netflix的那一套eureka,config而言,nacos做的更加集成化,轻量级,而且完全国产化,是阿里巴巴自研微服务框架技术,更重要的和阿里内部的其他消息中间件rocketMq,更加友好,而且最近adb出了mysql版本,叫ads,后期应该也会有更好的融合!

 

 

你可能感兴趣的:(nacos)