目錄
需求:業務量升級,老大要求使用nacos微服務架構,技研玩了一下,從搭建到使用一整套流程
1、首先需要搭建Nacos-server
nacos搭建環境要求,如下:
- 64位操作系統,支持 Linux/Unix/Mac/Windows
- 64 位 JDK 1.8+
- Maven 3.2.x+
- 目前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頁面如下,還是挺帶勁的
如果想修改端口號和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依賴:
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
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依賴:
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
同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!!! 如下
config配置中心
config的pom依賴:
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<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>
<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>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
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一下:在配置中心配置下
接口讀取一下:
在nacos-server配置中心更改下,不重啓服務
調用/actuator/refresh自動刷新
返回值,他會給你哪些key發生了變化,真好!這個可以支持我們局部更新配置屬性,不用全量更新了
然後調一下配置讀取接口
配置中心的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<String> getList(){
return this.restTemplate.postForObject(URL_PREFIX+"/getUserList",null,List.class);
}
}
然後在服務提供方provider寫一個對應的服務接口
@RestController
@Slf4j
public class NacosProviderController {
@RequestMapping(value="/getUserList")
public List<String> getUserList(){
log.info("開始調用start");
List<String> 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;
}
}
然後啓動服務提供者和服務消費者,看效果
可以,序列化他已經幫你做了!!
使用OpenFeign進行遠程請求
需要在上面的consumer上面增加feign依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
消費者調用使用FeignClient,需要做的就是自己要寫一下接口,比RestTemplate工作量要稍微大一點,但是更服務Java的架構思想,各有優劣點,自行選擇
@RestController
@RequestMapping(value = "/service-inlet")
public class NacosConsumerController {
@Autowired
private UserApi UserApi;
@RequestMapping("/getFeignList")
public List<String> 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<String> getFeignList();
}
最後在啓動類上添加@EnableFeignClients,標註這是一個Feign客戶端
@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerStartApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerStartApplication.class, args);
}
}
啓動後,再調用接口查看下使用Feign的效果
也好使!!
兩者的優缺點:
RestTemplate:優點-->代碼不用冗餘寫中間接口,易讀,缺點--> 代碼不優雅,還需要寫url
Feign:優點-->代碼優雅,一如既往的像之前的那種service和serviceImpl(此時在provider工程裏實現的)缺點-->需要額外寫中間接口
至此對nacos的技術預研告一段落,相比netflix的那一套eureka,config而言,nacos做的更加集成化,輕量級,而且完全國產化,是阿里巴巴自研微服務框架技術,更重要的和阿里內部的其他消息中間件rocketMq,更加友好,而且最近adb出了mysql版本,叫ads,後期應該也會有更好的融合!