一、创建Eureka注册中心
1. 创建Eureka注册中心工程
- 【创建普通工程,parent为”parent工程”】
- 添加eureka依赖 【因为parent有springcloud 和spring boot的版本管理 所以不需要有version】
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2 .@EnableEurekaServer
主启动类添加@EnableEurekaServer 注解/**
* @EnableEurekaServer: 启动Eureka功能
*/
@EnableEurekaServer
@SpringBootApplication
public class Pro05SpringCloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(Pro05SpringCloudEurekaApplication.class, args);
}
}
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
<a name="U42m1"></a>
## 4. Eureka启动报错
jdk 版本问题,高版本的jdk去除了一些类
```xml
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
二、将provider注册到Eureka
1. 加入依赖
[在provider工程中操作] 加入 eureka-client 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2. application.yaml
配置provider 的application.yaml
server:
port: 1000
# 将provider工程注册到eureka
# 配置当前微服务作为Eureka客户端访问Eureka服务器端时使用的地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:5000/eureka/
3. 在provider上添加注解 [不用加]
关于相关注解 【在provider的启动类上添加】
- 较低版本需要使用@EnableEurekaClient 注解。
- 稍高版本也可以使用@EnableDiscoveryClient 注解。 当前版本可以省略。
4. 注册成功后的效果
这里显示UNKNOWN是因为provider工程没有指定应用名称,指定应用名称配置方式如下:
# 指定微服务的名称,以便将来通过微服务名称调用当前微服务时能找到
spring:
application:
name: provider
以后在springCloud环境下开发,每个微服务工程都要设置一个应用名称
三、目标
1. 目标:consumer访问provider的时候 使用微服务名称 代替 localhost:1000
1) consumer工程添加 eureka-client 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2) consumer工程中的application.yaml 添加下面配置
server:
port: 4000
spring:
application:
name: consumer
eureka:
client:
service-url:
defaultZone: http://localhost:5000/eureka/
3) 在配置类中的restTemplate添加@LoadBalanced注解
这个注解会 给这个组件 有负载均衡的功能
@Configuration
public class CloudConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
4) 修改controller
修改consumer的controller方法
把localhost:1000 改为 http://provider
@RestController
public class MyController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/consumer/get/emp")
public Employee employee(){
// 1.远程调用方法的主机
// String host = "http://localhost:1000";
// 将远程微服务调用地址从 "IP地址+端口号改成"微服务名称""
String host = "http://provider";
// 2.远程调用方法的具体URL地址
String url = "/provider/get/employee";
Employee forObject = restTemplate.getForObject(host + url, Employee.class);
return forObject;
}
}
2. 目标:provider以集群方式启动
修改 provider的controller方法
@RestController
public class ProviderController {
@RequestMapping("/provider/get/QQId")
public String getQQ(HttpServletRequest request){
// 获取端口号
int serverPort = request.getServerPort();
return "2298320493 ---> " + serverPort;
}
}
IDEA运行多个实例: 右上角Edit Configurations 点击右上角的Allow parallel run 就可以运行多个实例了
开启一次修改一次配置文件:端口号分别是 1000 2000 3000
1) 注意:
provider 的微服务名称必须使用同一个名称才能构成一个集群,否则将不会认定为 是属于同一个集群。
- 然后consumer每次调用provider的controller时 就有了负载均衡