一、创建Eureka注册中心

1. 创建Eureka注册中心工程

  • 【创建普通工程,parent为”parent工程”】
  • 添加eureka依赖 【因为parent有springcloud 和spring boot的版本管理 所以不需要有version】
    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    4. </dependency>

    2 .@EnableEurekaServer

    主启动类添加@EnableEurekaServer 注解
    1. /**
    2. * @EnableEurekaServer: 启动Eureka功能
    3. */
    4. @EnableEurekaServer
    5. @SpringBootApplication
    6. public class Pro05SpringCloudEurekaApplication {
    7. public static void main(String[] args) {
    8. SpringApplication.run(Pro05SpringCloudEurekaApplication.class, args);
    9. }
    10. }

    3. application.yaml

    编写配置文件 ```yaml server: port: 5000

eureka: instance: hostname: localhost # 配置当前Eureka服务的主机地址 client: register-with-eureka: false # 当前服务本身就是注册中心,不必“自己注册自己” fetch-registry: false # 当前服务本身就是注册中心,不必“从注册中心取回信息” service-url: # 客户端(指consumer、provider)访问当前注册中心时使用的地址 defaultZone: http://${eureka.instance.hostname}/${server.port}/eureka

  1. <a name="U42m1"></a>
  2. ## 4. Eureka启动报错
  3. jdk 版本问题,高版本的jdk去除了一些类
  4. ```xml
  5. <dependency>
  6. <groupId>javax.xml.bind</groupId>
  7. <artifactId>jaxb-api</artifactId>
  8. <version>2.3.0</version>
  9. </dependency>
  10. <dependency>
  11. <groupId>com.sun.xml.bind</groupId>
  12. <artifactId>jaxb-impl</artifactId>
  13. <version>2.3.0</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.glassfish.jaxb</groupId>
  17. <artifactId>jaxb-runtime</artifactId>
  18. <version>2.3.0</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>javax.activation</groupId>
  22. <artifactId>activation</artifactId>
  23. <version>1.1.1</version>
  24. </dependency>

二、将provider注册到Eureka

1. 加入依赖

[在provider工程中操作] 加入 eureka-client 依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  4. </dependency>

2. application.yaml

配置provider 的application.yaml

  1. server:
  2. port: 1000
  3. # 将provider工程注册到eureka
  4. # 配置当前微服务作为Eureka客户端访问Eureka服务器端时使用的地址
  5. eureka:
  6. client:
  7. serviceUrl:
  8. defaultZone: http://localhost:5000/eureka/

3. 在provider上添加注解 [不用加]

关于相关注解 【在provider的启动类上添加】

  • 较低版本需要使用@EnableEurekaClient 注解。
  • 稍高版本也可以使用@EnableDiscoveryClient 注解。 当前版本可以省略。

4. 注册成功后的效果

未命名图片.png
这里显示UNKNOWN是因为provider工程没有指定应用名称,指定应用名称配置方式如下:

  1. # 指定微服务的名称,以便将来通过微服务名称调用当前微服务时能找到
  2. spring:
  3. application:
  4. name: provider

以后在springCloud环境下开发,每个微服务工程都要设置一个应用名称

三、目标

1. 目标:consumer访问provider的时候 使用微服务名称 代替 localhost:1000

未命名图片.png

1) consumer工程添加 eureka-client 依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  8. </dependency>

2) consumer工程中的application.yaml 添加下面配置

  1. server:
  2. port: 4000
  3. spring:
  4. application:
  5. name: consumer
  6. eureka:
  7. client:
  8. service-url:
  9. defaultZone: http://localhost:5000/eureka/

3) 在配置类中的restTemplate添加@LoadBalanced注解

  • 这个注解会 给这个组件 有负载均衡的功能

    1. @Configuration
    2. public class CloudConfig {
    3. @LoadBalanced
    4. @Bean
    5. public RestTemplate restTemplate(){
    6. return new RestTemplate();
    7. }
    8. }

    4) 修改controller

  • 修改consumer的controller方法

  • 把localhost:1000 改为 http://provider

    1. @RestController
    2. public class MyController {
    3. @Autowired
    4. private RestTemplate restTemplate;
    5. @RequestMapping("/consumer/get/emp")
    6. public Employee employee(){
    7. // 1.远程调用方法的主机
    8. // String host = "http://localhost:1000";
    9. // 将远程微服务调用地址从 "IP地址+端口号改成"微服务名称""
    10. String host = "http://provider";
    11. // 2.远程调用方法的具体URL地址
    12. String url = "/provider/get/employee";
    13. Employee forObject = restTemplate.getForObject(host + url, Employee.class);
    14. return forObject;
    15. }
    16. }

2. 目标:provider以集群方式启动

  • 修改 provider的controller方法

    1. @RestController
    2. public class ProviderController {
    3. @RequestMapping("/provider/get/QQId")
    4. public String getQQ(HttpServletRequest request){
    5. // 获取端口号
    6. int serverPort = request.getServerPort();
    7. return "2298320493 ---> " + serverPort;
    8. }
    9. }
  • IDEA运行多个实例: 右上角Edit Configurations 点击右上角的Allow parallel run 就可以运行多个实例了

  • 开启一次修改一次配置文件:端口号分别是 1000 2000 3000

    1) 注意:

  • provider 的微服务名称必须使用同一个名称才能构成一个集群,否则将不会认定为 是属于同一个集群。

  • 然后consumer每次调用provider的controller时 就有了负载均衡