SpringCloud搭建netflix

网友投稿 247 2022-10-29


SpringCloud搭建netflix

1.打开官网稍微学习一下,了解一下spring cloud是个什么东西,大概有哪些组件等

https://spring.io/projects/spring-cloud

https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/

2.新建项目

打开网址:https://start.spring.io/

选择需要引入的组件,然后下载下来即可

3.更改项目结构

为了测试的方便,需将项目结构更改为多模块的项目。

步骤如下:

(1) 依次新建子模块register-center/provider/consumer,删除父模块中多余的src、target等文件夹

(2) 修改父模块的pom文件:仅保留配置节,配置节全部注释掉,因为可在子模块按需添加依赖。

(3) 修改register-center的pom中的依赖配置

org.springframework.cloud

spring-cloud-starter-netflix-eureka-server

(4) 修改provider和consumer的pom中依赖配置

org.springframework.boot

spring-boot-starter-web

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

4.新建相应的测试类和配置文件

4.1 register-center模块

启动类

package com.hdwang.springcloudtest.registercenter;

import org.springframework.boot.SpringApplication;

import org.springframework.boohttp://t.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication

@EnableEurekaServer

public class Application {

/**

* 运行点对点模式(集群模式)时,通过添加VM参数启动不同的注册中心节点实例

* 例如:-Dspring.profiles.active=peer2

*

* @param args

*/

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}

yml配置

spring:

application:

#应用名

name: register-center

freemarker:

template-loader-path: classpath:/templates/

prefer-file-system-access: false

#激活的配置,可运行时添加参数进行修改 -Dspring.profiles.active=peer2

profiles:

active: peer1

# #Eureka独立模式配置,仅有一个注册中心节点

#server:

# port: 8090

#eureka:

# instance:

# hostname: localhost

# client:

# #仅仅作为注册中心,既不提供服务也不订阅服务

# registerWithEureka: false

# fetchRegistry: false

# #注册中心地址

# serviceUrl:

# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

# Eureka点对点模式,保证注册中心高可用,注册的实例信息会在点与点之间相互同步

eureka:

client:

serviceUrl:

defaultZone: http://peer1.com:8091/eureka/,http://peer2.com:8092/eureka/,http://peer3.com:8093/eureka/

---

#每个注册中心节点不同的配置

spring:

profiles: peer1

server:

port: 8091

eureka:

instance:

#在本机hosts中配置即可

hostname: peer1.com

---

spring:

profiles: peer2

server:

port: 8092

eureka:

instance:

hostname: peer2.com

---

spring:

profiles: peer3

server:

port: 8093

eureka:

instance:

hostname: peer3.com

4.2 provider模块

启动类

package com.hdwang.springcloudtest.provider;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class Application {

/**

* 运行时添加VM参数: -Dserver.port=8082可以启动多个provider实例

*

* @param args

*/

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}

服务注册类

package com.hdwang.springcloudtest.provider.restservice;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

/**

* 注册的服务

*/

@RestController

public class RestService {

/**

* 日志

*/

private static final Logger LOG = LoggerFactory.getLogger(RestService.class);

@RequestMapping("/sayHello")

public String sayHello(String name) {

LOG.info("sayHello was called");

return "hello, " + name;

}

}

yml配置

spring:

application:

#应用名,也是eureka的服务名

name: provider

freemarker:

template-loader-path: classpath:/templates/

prefer-file-system-access: false

server:

#运行时,添加参数-Dserver.port=8082运行新的provider实例

port: 8081

eureka:

client:

#注册中心地址

serviceUrl:

#注册中心独立模式

#defauZWnXAJDQltZone: http://localhost:8090/eureka/

#注册中心点对点模式

defaultZone: http://peer1.com:8091/eureka/,http://peer2.com:8092/eureka/,http://peer3.com:8093/eureka/

4.3 consumer配置

启动类

package com.hdwang.springcloudtest.consumer;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}

服务调用测试类

package com.hdwang.springcloudtest.consumer.controller;

import com.netflix.appinfo.InstanceInfo;

import com.netflix.discovery.EurekaClient;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.http.HttpEntity;

import org.springframework.http.HttpHeaders;

import org.springframework.http.MediaType;

import org.springframework.http.ResponseEntity;

import org.springframework.util.LinkedMultiValueMap;

import org.springframework.util.MultiValueMap;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;

import java.util.*;

/**

* 测试

*/

@RestController

public class TestController {

/**

* 使用服务名才能负载均衡,不能使用直接使用地址

*/

private static final String REST_URL_PREFIX = "http://provider";

@Autowired

private EurekaClient discoveryClient;

@Autowired

private RestTemplate restTemplate;

@GetMapping("/testGet")

public String testGet() {

ResponseEntity res = restTemplate.getForEntity(REST_URL_PREFIX + "/sayHello?name={1}", String.class, getName());

return res.getBody();

}

@GetMapping("/testPost")

public String testPost() {

MultiValueMap params = new LinkedMultiValueMap();

params.add("name", getName());

// HttpHeaders headers = new HttpHeaders();

// headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

HttpEntity< MultiValueMap> request = new HttpEntity<>(params, null);

ResponseEntity res = restTemplate.postForEntity(REST_URL_PREFIX + "/sayHello", request, String.class);

return res.getBody();

}

private String getName() {

List greetings = Arrays.asList("Bob", "Alice", "Jack");

Random rand = new Random();

int randomNum = rand.nextInt(greetings.size());

return greetings.get(randomNum);

}

}

RestTemplate负责均衡配置类

package com.hdwang.springcloudtest.consumer.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.client.RestTemplate;

@Configuration

public class RestTemplateConfig {

/**

* 构建有负载均衡功能的RestTemplate实例对象

*

* @return RestTemplate实例对象

*/

@Bean

@LoadBalanced

RestTemplate restTemplate() {

return new RestTemplate();

}

}

yml配置

spring:

application:

#应用名,也是Eureka的服务名

name: cosumer

server:

port: 8088

eureka:

client:

#注册中心地址

serviceUrl:

#注册中心独立模式

#defaultZone: http://localhost:8090/eureka/

#注册中心点对点模式

defaultZone: http://peer1.com:8091/eureka/,http://peer2.com:8092/eureka/,http://peer3.com:8093/eureka/

5.运行测试

5.1本机hosts配置

127.0.0.1 peer1.com

127.0.0.1 peer2.com

127.0.0.1 peer3.com

5.2 编辑运行配置

三个注册中心节点运行配置

两个服务提供者的运行配置

5.3 运行程序

(1) 启动注册中心

依次启动RegisterCenter1->RegisterCenter2->RegisterCenter3,启动成功后,可访问http://localhost:8091/ 或http://localhost:8092/ 或http://localhost:8093/ 查看是否启动成功

(2)启动服务提供者provider

依次启动Provider1->Provider2, 随便访问一个注册中心地址首页即可查看状态,如下图

(3) 启动消费者cosumer

(4) 在浏览器中进行测试

测试地址:http://localhost:8088/testPost / http://localhost:8088/testGet

(5) 在Provider1/Provider2的控制台中可以看到输出结果

2021-04-07 15:26:56.043  INFO 8796 --- [nio-8081-exec-1] c.h.s.provider.restservice.RestService   : sayHello was called

2021-04-07 15:26:58.860  INFO 8796 --- [nio-8081-exec-2] c.h.s.provider.restservice.RestService   : sayHello was called

2021-04-07 15:26:59.535  INFO 8796 --- [nio-8081-exec-3] c.h.s.provider.restservice.RestService   : sayHello was called

2021-04-07 15:26:59.925  INFO 8796 --- [nio-8081-exec-4] c.h.s.provider.restservice.RestService   : sayHello was called

2021-04-07 15:27:00.266  INFO 8796 --- [nio-8081-exec-5] c.h.s.provider.restservice.RestService   : sayHello was called

2021-04-07 15:27:00.663  INFO 8796 --- [nio-8081-exec-6] c.h.s.provider.restservice.RestService   : sayHello was called

2021-04-07 15:27:00.938  INFO 8796 --- [nio-8081-exec-7] c.h.s.provider.restservice.RestService   : sayHello was called

2021-04-07 15:26:58.602  INFO 17828 --- [nio-8082-exec-1] c.h.s.provider.restservice.RestService   : sayHello was called

2021-04-07 15:26:59.194  INFO 17828 --- [nio-8082-exec-2] c.h.s.provider.restservice.RestService   : sayHello was called

2021-04-07 15:26:59.737  INFO 17828 --- [nio-8082-exec-3] c.h.s.provider.restservice.RestService   : sayHello was called

2021-04-07 15:27:00.109  INFO 17828 --- [nio-8082-exec-4] c.h.s.provider.restservice.RestService   : sayHello was called

2021-04-07 15:27:00.414  INFO 17828 --- [nio-8082-exec-5] c.h.s.provider.restservice.RestService   : sayHello was called

2021-04-07 15:27:00.815  INFO 17828 --- [nio-8082-exec-6] c.h.s.provider.restservice.RestService   : sayHello was called

恭喜!至此,Spring Clound 微服务集群框架您已经搭建成功!

附录

github地址:https://github.com/hdwang123/springcloudtest

参考文章:

https://zhihu.com/question/283286745/answer/763040709

https://cnblogs.com/qdhxhz/p/9357502.html

https://cnblogs.com/cjsblog/p/8005766.html

https://blog.csdn.net/weixin_44448094/article/details/88535475


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【基础部分】之管理系统中的简单分区和文件系统
下一篇:apache静态化页面
相关文章

 发表评论

暂时没有评论,来抢沙发吧~