zyt温柔发 发表于 2022-2-17 14:30

SpringCloud学习心得---创建consumer、provider、Eureka基础测试环境

1 基本组件

[*]注册中心:Eureka
[*]负载均衡:Ribbon
[*]声明式调用远程方法:Ribbon
[*]熔断、降级、监控:Hystrix
[*]网关:zuul


2 学习使用版本
<version>Greenwich.SR2</version>
3 目标 1:准备基础测试环
3.1 结构

3.2 创建父工程

配置依赖管理
<dependencyManagement>
      <dependencies>
            <!-- 导入 SpringCloud 需要使用的依赖信息 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR2</version>
                <type>pom</type>
                <!-- import 依赖范围表示将 spring-cloud-dependencies 包中的依赖信息导入 -->
                <scope>import</scope>
            </dependency>
            <!-- 导入 SpringBoot 需要使用的依赖信息 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
      </dependencies>
    </dependencyManagement>
3.3创建通用工程

创建实体类com.study.spring.cloud.entity.Employee并生成构造函数和getset方法:
public class Employee {
    private Integer empId;
    private String empName;
    private Double empSalary;
3.4创建提供者工程

加入如下依赖信息:
<dependencies>
      <!--引入spring boot依赖-->
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <!--引入commom依赖-->
      <dependency>
            <groupId>com.study.spring.cloud</groupId>
            <artifactId>spring-cloud-study-common</artifactId>
            <version>1.0-SNAPSHOT</version>
      </dependency>
    </dependencies>
创建主启动类:
@SpringBootApplication
public class AtzytMainType {
    public static void main(String[] args) {
      SpringApplication.run(AtzytMainType.class, args);
    }
}
创建 application.yml 配置文件:server.port: 1000
创建 handler 类和方法com.study.spring.cloud.hander.EmployeeHander:
@RestController
public class EmployeeHander {
    @RequestMapping("/provider/get/employee/remote")
    public Employee getEmployeeRemote() {
      return new Employee(555, "tom555"+port, 555.55);
    }
}
3.5创建消费者工程

<dependencies>
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <!--引入commom依赖-->
      <dependency>
            <groupId>com.study.spring.cloud</groupId>
            <artifactId>spring-cloud-study-common</artifactId>
            <version>1.0-SNAPSHOT</version>
      </dependency>
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>
    </dependencies>
创建主启动类:
@SpringBootApplication
public class AtzytMainType {
    public static void main(String[] args) {
      SpringApplication.run(AtzytMainType.class, args);
    }
}
创建配置类com.study.spring.cloud.config.AtzytSpringCloudConfig提供RestTemplate
创建hander类com.study.spring.cloud.hander.HumanResourceHandler:
@RestController
public class HumanResourceHandler {
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/consumer/ribbon/get/employee")
    public Employee getEmployeeRemote() {
      // 远程调用方法的主机地址
      String host = "http://localhost:1000";
      // 远程调用方法的具体 URL 地址
      String url = "/provider/get/employee/remote";
      return restTemplate.getForObject(host + url, Employee.class);
    }
}
创建 application.yml 配置文件:server.port:4000
4 目标 2:创建 Eureka 注册中心
4.1子目标 1:创建 Eureka 注册中心

加入如下依赖信息:
<dependencies>
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      </dependency>
    </dependencies>
创建主启动类:
//启用eureka服务器端功能
@EnableEurekaServer
@SpringBootApplication
public class AtzytMainType {
    public static void main(String[] args) {
      SpringApplication.run(AtzytMainType.class, args);
    }
}
创建 application.yml:
server:
port: 5000
eureka:
instance:
    hostname: localhost
client:
    register-with-eureka: false    # 自己就是注册中心,所以自己不注册自己
    fetch-registry: false    # 自己就是注册中心,所以不需要“从注册中心取回信息”
    service-url: # 客户端访问 Eureka 时使用的地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4.2子目标 2:将 provider 注册到eureka
provider加入如下依赖:
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>
provider配置 application.yml:
eureka:
client:
    service-url:
      defaultZone: http://localhost:5000/eureka/
spring:
application:
    name: study-provider
启动eureka和provider服务,注册的效果:

5 目标 3:consumer 访问 provider 时使用微,服务名称代替 localhost:1000:
5.1分析

5.2操作
在 consumer 工程加入如下:
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
      </dependency>
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>
在 application.yml 中加入如下配置:
spring:
application:
    name: study-consumer
eureka:
client:
    service-url:
      defaultZone: http://localhost:5000/eureka
在 RestTemplate 的配置方法处使用@LoadBalanced 注解
@Bean
    //这个注解让RestTemplate有负载均衡的功能,通过调用Ribbon访问provider集群
    @LoadBalanced
    public RestTemplate getRestTemplate() {
      return new RestTemplate();
    }
修改 consumer 工程的 handler 方法:
@RestController
public class HumanResourceHandler {
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/consumer/ribbon/get/employee")
    public Employee getEmployeeRemote() {
      // 远程调用方法的主机地址
      // String host = "http://localhost:1000";
      // 引入 Eureka 和 Ribbon 后,就可以使用微服务名称替代 IP 地址+端口号
      String host = "http://study-provider";
      // 远程调用方法的具体 URL 地址
      String url = "/provider/get/employee/remote";
      return restTemplate.getForObject(host + url, Employee.class);
    }
}
6 目标 4:provider 以集群方式启
6.1修改 provider的hander方法
@RestController
public class EmployeeHander {
    @RequestMapping("/provider/get/employee/remote")
    public Employee getEmployeeRemote(HttpServletRequest request) {
      int port = request.getServerPort();
      return new Employee(555, "tom555"+port, 555.55);
    }
}
6.2provider 以集群方式启动
    按照端口号 1000 启动第一个实例
    按照端口号 2000 启动第二个实例
    按照端口号 3000 启动第三个实例
6.3启动各服务测试效果


测试访问consumer远程调用provider1000端口:

刷新网页2000端口:

刷新网页3000端口:

atai 发表于 2022-2-17 21:19

老兄,netflix已经停更了

zyt温柔发 发表于 2022-2-17 21:36

atai 发表于 2022-2-17 21:19
老兄,netflix已经停更了

这个是以前我的学习笔记,翻来整理整理,spring cloud版本也不是最新的
页: [1]
查看完整版本: SpringCloud学习心得---创建consumer、provider、Eureka基础测试环境